Linux c 编程问题请教,同一时间运行多个相同的程序,如何确保每个程序生成的随机数在彼此之间也是随机的?

2022-09-16 16:18:40 +08:00
 qemu32

https://stackoverflow.com/questions/822323/how-to-generate-a-random-int-in-c

stackoverflow 上的这个问题最高赞的回答不能满足我的要求,因为同一时间运行多个调用 rand() 的程序,生成的随机数在这几个程序之间都是一样的,因为种子都是当前时间,这个问题下面的其他答案我也试了,比如用 openssl 生成的也不是真正的随机数。

我希望有一种办法能生成真正的随机数。

2215 次点击
所在节点    Linux
21 条回复
litguy
2022-09-16 16:24:41 +08:00
可以试试程序从 /dev/random 下面读取数字,然后和当前时间加起来作为种子
在每个程序的上述动作中,使用一个互斥锁
这样就能保证不一样的种子了
qemu32
2022-09-16 16:26:22 +08:00
@litguy 感谢回复,为什么要使用互斥锁呢?
freeminder
2022-09-16 16:39:09 +08:00
加一下当前进程 ID 呢?
qemu32
2022-09-16 16:44:21 +08:00
@litguy 重新试了一下用 openssl 是可以的,用你说的那个方式不加互斥锁也是可以的
qemu32
2022-09-16 16:44:35 +08:00
@freeminder 好主意
qemu32
2022-09-16 16:47:40 +08:00
@freeminder 试了一下加上当前进程 id 是可以的
codehz
2022-09-16 16:50:52 +08:00
@litguy 不用锁,读 random 和使用 getrandom 系统调用是一样的结果,都是独立生成的
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();
ysc3839
2022-09-16 18:25:38 +08:00
@SunBK201 这种情况下 clock_gettime 建议使用 CLOCK_MONOTONIC_COARSE ,monotonic 能保证取到的值是递增的,不会受系统时间设置影响,coarse 会降低精度,但调用速度更快。
https://man7.org/linux/man-pages/man3/clock_gettime.3.html
momocraft
2022-09-16 18:31:47 +08:00
so 已经有回答提到了 /dev/random 和 urandom 其背后是内核的 entropy pool
如果这还不够 你最好先讲清楚什么是"真正随机数"
qemu32
2022-09-16 18:33:14 +08:00
@momocraft 我的问题已经解决了,最简单的方式就是 srand 的时候加上当前进程的 id
ysc3839
2022-09-16 18:37:10 +08:00
@qemu32 建议改用线程 ID
qemu32
2022-09-16 18:45:26 +08:00
@ysc3839 为什么?
Building
2022-09-16 18:46:08 +08:00
@qemu32 加进程 ID 这个还是有风险吧,ID 不同,随机数也不同啊
jeeyong
2022-09-16 18:53:10 +08:00
uuid 是不是有个限定命名空间的? python 是 uuid5
能够确保在命名空间里是唯一的.
ysc3839
2022-09-16 19:39:07 +08:00
@qemu32 因为同一进程中不同线程取到的进程 ID 是一样的
@jeeyong uuid 生成器一般就是用系统的安全随机数生成器生成的,比如前面提到的 /dev/random
yanqiyu
2022-09-16 19:49:27 +08:00
"真正的随机数"
建议直接读 random/getrandom()/CPU 允许的话直接__builtin_ia32_rdrand64_step()
YsHaNg
2022-09-16 22:13:25 +08:00
@ysc3839 timespec_get 更跨平台 clock_gettime 在 glibc 里是直接转发 timespec_get
littlewing
2022-09-16 22:59:42 +08:00
jeeyong
2022-09-17 11:09:16 +08:00
@ysc3839 噢...受教了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/880604

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX