30/09/2018, 16:10

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.

Đăng ký khóa học C++ cơ bản 2016 ( NEW ) tại đây : Thông tin về khóa học xem tại đây : -Sự khác biệt giữa 2 khóa học cũ và mới : +Khóa học C++ cơ bản 2016 là khóa học mới, được đầu tư nhiều hơn từ nội dung, phương pháp học, cách học hiệu quả. +Trong khóa học còn có nhiều kiến thức mới như thực hành trên HackerRank, thực hành trên Codefights và Đạt nghĩ mọi người nên học khóa học mới, bởi vì đây là kiến thức mới, phù hợp với hiện tại..... Mặt khác âm thanh cũng tốt hơn nhiều so với khóa học …

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

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

stackoverflow.com
John Dibling

C++ random float number generation

c++, random, floating-point
answered by John Dibling on 03:54PM - 26 Mar 09

Thực tế khắc nghiệt viết 18:22 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:24 ngày 30/09/2018

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

1.23123, 0.6594609
Thực tế khắc nghiệt viết 18:21 ngày 30/09/2018

é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à

Nguyễn Minh Dũng viết 18:26 ngày 30/09/2018

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

maivanquan viết 18:11 ngày 30/09/2018

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 ?

Nguyễn Minh Dũng viết 18:11 ngày 30/09/2018

Đượ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)

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)));

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

maivanquan viết 18:11 ngày 30/09/2018

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 .

#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");
}
Nguyễn Minh Dũng viết 18:21 ngày 30/09/2018

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();
}
maivanquan viết 18:27 ngày 30/09/2018

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 . .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 ạ ?

Nguyễn Minh Dũng viết 18:12 ngày 30/09/2018

e ko cần dùng thư viện cũng ra kết quả được

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

maivanquan viết 18:15 ngày 30/09/2018

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 .

Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

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

Bài liên quan
0