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