
https://stackoverflow.com/questions/822323/how-to-generate-a-random-int-in-c
stackoverflow 上的这个问题最高赞的回答不能满足我的要求,因为同一时间运行多个调用 rand() 的程序,生成的随机数在这几个程序之间都是一样的,因为种子都是当前时间,这个问题下面的其他答案我也试了,比如用 openssl 生成的也不是真正的随机数。
我希望有一种办法能生成真正的随机数。
1 litguy Sep 16, 2022 可以试试程序从 /dev/random 下面读取数字,然后和当前时间加起来作为种子 在每个程序的上述动作中,使用一个互斥锁 这样就能保证不一样的种子了 |
3 freeminder Sep 16, 2022 加一下当前进程 ID 呢? |
5 qemu32 OP @freeminder 好主意 |
6 qemu32 OP @freeminder 试了一下加上当前进程 id 是可以的 |
8 SunBK201 Sep 16, 2022 "同一时间,调用 rand()" 可能是 srand() 的精度不够高,可以提升至纳秒级别: struct timespec seed; clock_gettime(CLOCK_REALTIME, &seed); srand(seed.tv_sec + seed.tv_nsec); randnum = rand(); |
9 ysc3839 Sep 16, 2022 via Android @SunBK201 这种情况下 clock_gettime 建议使用 CLOCK_MONOTONIC_COARSE ,monotonic 能保证取到的值是递增的,不会受系统时间设置影响,coarse 会降低精度,但调用速度更快。 https://man7.org/linux/man-pages/man3/clock_gettime.3.html |
10 momocraft Sep 16, 2022 so 已经有回答提到了 /dev/random 和 urandom 其背后是内核的 entropy pool 如果这还不够 你最好先讲清楚什么是"真正随机数" |
15 jeeyong Sep 16, 2022 uuid 是不是有个限定命名空间的? python 是 uuid5 能够确保在命名空间里是唯一的. |
16 ysc3839 Sep 16, 2022 via Android |
17 yanqiyu Sep 16, 2022 "真正的随机数" 建议直接读 random/getrandom()/CPU 允许的话直接__builtin_ia32_rdrand64_step() |
19 littlewing Sep 16, 2022 |