
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 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 |