使用 /dev/urandom 规避 srand(time(0)) 的整数弊端
某位同学设计了一个 A + B 的交互题,为了搞随机数据。
但是因为时间函数 time(0)
总是返回秒数,就会导致随机数一致的情况:
直到今天,这个搁置了很久的问题我打算去解决一下。
因为之前闲着没事 cat /dev/random
,自然想到使用 /dev/random
解决。但是据说 /dev/random
越调用越慢,所以换用更好用的 /dev/urandom
。
我们需要设法读取 /dev/urandom
。但是 freopen/fopen
会出问题(读不出什么东西,容易挂),所以需要更加手动的方式打开文件。
int fd = open("/dev/urandom", O_RDONLY);
翻译过来就是说,打开文件 /dev/urandom
,并以只读模式加载,存在文件标识符 fd
里。
为什么只读不用说吧
(需要头文件 unistd.h
)
read(fd, &seed, sizeof seed);
这行的意思是,从文件标识符 fd
里(即从 /dev/urandom
里)读取一段字节(buffer
),写入 seed
中。
接下来,就是随机数生成了:
mt19937 mt_rand(seed);
long long a = mt_rand() % 2147483648;
long long b = mt_rand() % 2147483648;
这样生成的随机数,随机又美观。
关于 read/open
,我觉得这篇文章讲得很好,可以一看。
ToUNVRSe
2023年5月30日 @ 16:41
你说得对,但是为什么不使用
chrono::steady_clock::now().time_since_epoch().count()
Imken Luo
2023年5月31日 @ 21:31
抱歉这么久才看到 你这个评论被系统误标记成垃圾评论了(
这又是什么花里胡哨的
chrono
namespace 啊(ToUNVRSe
2023年6月6日 @ 18:57
抱歉这么久才看到 没上邮箱(
打错了是
chrono::steady_clock().now().time_since_epoch().count()
QAQ