01/10/2018, 16:28
Sinh số ngẫu nhiên khi hàm chuẩn (!) không đáp ứng
void nhapMang(int *a, int n)
{
srand(time(NULL));
for (int i = 0; i < n; i++)
{
a[i] = rand()%1000000 + 1;
}
printf("
");
}
em muốn ramdom 1 mảng gồm 1 triệu phần tử khác nhau nhưng khi ra kq thì phần từ max là 32767 và trùng lặp rất nhiều trong khi em biết miền giá trị int là hơn 2 triệu phần tử .Vậy thì như thế là tại sao và em phải làm như thế nào (máy e chạy visual 2015 64bit kiểm tra thì sizeof(int) = 4 bytes)
Bài liên quan
Tại vì hàm rand() có giá trị từ 0 đến RAND_MAX. Bạn có thể kiểm tra giá trị RAND_MAX( trong thư viện ) bằng cách print ra thôi. Còn giải quyết thì mình chẳng có cách gì hay chỉ có cách cùi cùi này thôi
B1: chơi hẳn một mảng từ 1 đến 1 triệu
B2: tìm bài GoodPracticeRNG lấy code về dùng thay (chứ giờ sao)
B3: dùng Knuth shuffle.
B4: ???
B5: profit!
Thông minh
mình cũng tìm được sự phức tạp của ví dụ khác
Question
Sign in to vote
0
Sign in to vote
wjhwong wrote:
Here is a simple polynomial-based random number generator that produces 32
bits at a time. You can call it twice and combine the values:
–
Tim Roberts, timr@probo.com
Providenza & Boekelheide, Inc.
Tim Roberts, DDK MVP
do trong VC++ RAND_MAX là 32767 (15 bit) nên nó ko random số lớn hơn 32767 được, có thể khắc phục bằng cách ghép 2 số lại:
hoặc viết đại 1 cái hàm random khác:
hoặc xài xorshift như code ở post phía trên có lẽ chất lượng random tốt hơn 1 tí