Tôi đã triển khai một hashmap trong C như một phần của dự án tôi đang thực hiện và sử dụng các phần chèn ngẫu nhiên để kiểm tra nó khi tôi nhận thấy rằng rand()
trên Linux dường như lặp lại các con số thường xuyên hơn nhiều so với trên Mac. RAND_MAX
là 2147483647 / 0x7FFFFFFF trên cả hai nền tảng. Tôi đã giảm nó xuống chương trình thử nghiệm này tạo ra một mảng byte RAND_MAX+1
dài, tạo ra RAND_MAX
các số ngẫu nhiên, ghi chú nếu mỗi cái là một bản sao và kiểm tra nó ra khỏi danh sách như đã thấy.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main() {
size_t size = ((size_t)RAND_MAX) + 1;
char *randoms = calloc(size, sizeof(char));
int dups = 0;
srand(time(0));
for (int i = 0; i < RAND_MAX; i++) {
int r = rand();
if (randoms[r]) {
// printf("duplicate at %d\n", r);
dups++;
}
randoms[r] = 1;
}
printf("duplicates: %d\n", dups);
}
Linux liên tục tạo ra khoảng 790 triệu bản sao. Mac luôn chỉ tạo một, do đó, nó lặp qua mọi số ngẫu nhiên mà nó có thể tạo gần như không lặp lại. Bất cứ ai có thể xin vui lòng giải thích cho tôi làm thế nào điều này làm việc? Tôi không thể nói bất cứ điều gì khác với các trang dành cho nam giới, không thể biết RNG mỗi trang đang sử dụng và không thể tìm thấy bất cứ điều gì trực tuyến. Cảm ơn!