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