ฉันใช้ hashmap ใน C เป็นส่วนหนึ่งของโครงการที่ฉันกำลังทำงานและใช้การแทรกแบบสุ่มเพื่อทดสอบเมื่อฉันสังเกตเห็นว่าrand()
บน Linux ดูเหมือนว่าจะซ้ำตัวเลขบ่อยกว่าบน Mac RAND_MAX
คือ 2147483647 / 0x7FFFFFFF บนทั้งสองแพลตฟอร์ม ฉันได้ลดขนาดลงในโปรแกรมทดสอบนี้ที่ทำให้อาร์เรย์แบบRAND_MAX+1
ยาว - ยาวสร้างRAND_MAX
ตัวเลขแบบสุ่มบันทึกว่าแต่ละรายการซ้ำกันหรือไม่และตรวจสอบออกจากรายการตามที่เห็น
#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 สร้างข้อมูลซ้ำประมาณ 790 ล้านรายการอย่างสม่ำเสมอ Mac อย่างต่อเนื่องเพียงสร้างหนึ่งจึง loops ผ่านจำนวนสุ่มทุกที่จะสามารถสร้างเกือบได้โดยไม่ต้องทำซ้ำ ใครช่วยอธิบายให้ฉันฟังได้ว่ามันใช้งานได้อย่างไร? ฉันไม่สามารถบอกอะไรที่แตกต่างจากหน้าคนไม่สามารถบอกได้ว่า RNG ใดที่ใช้กันและไม่พบสิ่งใดทางออนไลน์ ขอบคุณ!