Cách sinh số ngẫu nhiên (random) là số thực?

Hồi trước Đạt có làm video sinh số ngẫu nhiên.

Hôm nay @Nhanh_Lan_R_ng có đặt câu hỏi cách sinh số ngẫu nhiên, mà là số thực. Ai có giải pháp gì không :smile:

Gợi ý nhé

muốn có số thực thì mình ép kiểu kết quả của rand() thành float, rồi chia cho một số.

Để lấy giá trị từ  0.0 to 1.0
float r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);

0.0 -> X

float r2 = static_cast <float> (rand()) / (static_cast <float> (RAND_MAX/X));

LO -> HI

float r3 = LO + static_cast <float> (rand()) /( static_cast <float> (RAND_MAX/(HI-LO)));

Nguồn

5 Likes

Hùi trc xem clip này a đạt và lên mạng đọc thấy này cũng hay
http://diendan.congdongcviet.com/threads/t5643::sinh-so-ngau-nhien-trong-pham-vi-tuy-y.cpp

Video và link kia nói về random số nguyên :smile: Bài này khó hơn chút, là random ra số thực. Đó là mấy số như

1.23123, 0.6594609
1 Like

ép kiểu thì k đc rồi! chắc chỉ có cách của thôi à! sao mình k làm 1 vòng lặp làm mốc rồi sinh số ngẫu nhiên dựa trên vòng lặp đó a nhỉ ví dụ lấy 1/2 1/3 ra float mà :wink:

gợi ý của anh ở trên đấy. Làm theo thử xem :smile:

1 Like

giả sử e cho 1 số random kieu nguyen nhưng cout ra 1 số khác bằng số đó chia cho 1 số thực ( ví dụ căn 3 ) được ko a Đạt ?

Được chứ, miễn sao ra số thực là được.

Ở đây anh có nói khá rõ rồi này, lơ chữ static_cast<float> đi

cứ nói như là mình đang ép kiểu (float)

@Khang_Nguyen giải thích vụ static_cast được không :smile:

1 Like

e xem đoạn code của a Đạt ở trên có nhiều chỗ không hiểu quá , e code theo cách e hiểu , đầu tiên e lấy ngẫu nhiêu 1 số từ 1 tới 101 , sau đó lấy số đó chia cho 1 số thực ( ví dụ căn 3 ) . rồi lấy số đó trừ đi phần nguyên thì được 1 số ngẫu nhiên từ 0 đến 1 . :stuck_out_tongue:

#include <iostream> 
#include <time.h>
#include <math.h>
using namespace std ;

void main () 
{
	int x ;
	float y ;
	srand ( time ( NULL ) ) ;
	x = rand()%100 + 1; 
	y = x / sqrt (3) ; 
	y = y - ( int ) y ;
	cout << y << endl ;
	system ("pause");
}
1 Like

Khá, làm gì cũng được, miễn là làm theo ý tưởng của mình và chạy được là được.

Đây là cách anh gợi ý

Để lấy giá trị từ 0.0 to 1.0
float r = static_cast (rand()) / static_cast (RAND_MAX);

Code C đây

#include <stdio.h>      /* printf, NULL */
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */

int main()
{
    srand (time(NULL)); // seed initialization
    for (int i = 0; i < 10; ++i)
    {
        float r = (float) (rand()) / (float) (RAND_MAX);
        printf("%f\n", r);
    }

    getchar();
}

Code C++ đây

#include <iostream>     /* std::cout, std::enld */
#include <stdio.h>      /* getchar, NULL */
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */

int main()
{
    srand (time(NULL)); // seed initialization
    for (int i = 0; i < 10; ++i)
    {
        float r = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
        std::cout << r << std::endl;
    }

    getchar();
}
1 Like

mãi mới hiểu hết được mấy cái code ở trên của a , hóa ra cái thằng static_cast kia là để đổi kiểu int sang các kiểu khác . còn thằng RAND_MAX là thằng mặc định bằng 32767 . :smile: .cơ mà trong visual studio e ko cần dùng thư viện <stdio.h> cũng ra kết quả được , mình có cần chú ý khi nào nên dùng , khi nào ko không ạ ?

1 Like

Em đang nói tới thư viện nào?

1 Like

thư viện stdio.h ạ a Đạt .e biết tại sao nó ko hiển thị dòng chữ e viết rồi , tại e để trong dấu ngoặc nhọn .

1 Like

Complier khác có thể tự động include stdio.h

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?