我在循环中读取dev / urandom以创建模拟的随机数。它没有工作,我最终将问题跟踪到以下代码示例
int myFile = open("/dev/urandom", O_RDONLY);
begin outer loop
for (ii = 0 ; ii<12 ; ii++ )
{
read(myFile, &rand, 2) ;
printf("%d " , (int) rand) ;
}
产生如下输出。这显然不是随机的,例如,它连续36次给出54603,而在其他运行中,连续给出数字相似的次数。 在这里发生了什么,我的印象是从dev / urandom读取应该给出相当随机的数字。我在这里做错了吗?
在FreeBSD 10.3和Solaris 11上测试
14315 18369 22645 5910 55240 17092 32556 55028 34376 34902 44236 56796
15767 54265 22372 38639 44446 25037 58094 28251 65329 48865 28057 59835
17135 57009 5612 8627 55111 365 9988 62402 42682 57066 59920 10659
21386 60845 9243 27377 18829 10162 64795 55836 53913 39765 51749 47917
21522 30166 44059 30351 15622 17957 43399 26184 44558 4553 41745 54603
2179 11970 21234 39538 45359 50854 58277 62479 4172 14207 20551 54455
27120 22497 51021 41488 51668 50638 13894 37707 19813 40971 52191 27702
29443 20239 59131 12186 24974 55298 56381 50092 11114 55533 11428 17223
30520 32207 42256 31605 32485 3700 47741 25023 50723 64056 44451 25864
30557 2136 55462 20308 35902 30238 21815 9255 48414 1956 27819 49185
34428 59204 1955 10782 20077 59336 27867 29254 46219 28142 19108 52866
39392 30683 40700 11760 7835 65096 22363 41318 9363 39016 34225 20539
39956 47480 12499 49225 15360 18322 38157 61226 43010 39099 9631 49289
40243 53645 10750 40712 32496 53093 2925 36166 60770 45263 30683 2537
41922 56658 30762 49046 64446 11102 53481 43032 11576 31789 17015 47093
44196 65248 30185 28250 27134 56704 42954 18203 36677 21296 22780 27224
50771 19717 34434 16434 43648 57975 64581 51131 748 21266 26116 29653
52032 13956 15378 8284 47951 24566 58583 61174 53515 1697 8710 46559
54603 54603 54603 54603 54603 54603 54603 54603 54603 54603 54603 54603
54603 54603 54603 54603 54603 54603 54603 54603 54603 54603 54603 54603
54603 54603 54603 54603 54603 54603 54603 54603 54603 54603 54603 54603
55683 26712 63891 36499 40089 58448 32114 14948 57516 35102 23239 45829
62055 29107 10766 37551 30467 33145 4124 46208 60329 54800 29127 53398
62990 41904 30506 58700 13996 24915 18279 54703 8346 29550 2794 19473
64367 38250 23821 41639 16940 5076 26526 26796 23550 58420 10689 18614
7471 34008 62429 27549 53162 37714 26394 37498 14193 15684 31649 31621
7614 16389 59721 27793 58153 9808 61092 15071 42413 57890 33708 5530
答案 0 :(得分:3)
我在这里做错了吗?
是的,代码正在使用rand
而没有先检查read(myFile, &rand, 2)
的返回值。
代码在阅读时遇到问题,因此请检查read()
的返回值。
if (read(myFile, &rand, 2) != 2) Handle_It();
else printf("%d " , (int) rand) ;
总是2吗?我怀疑代码是不耐烦的 - 代码只需要等待并在返回值&lt; 2,当返回值为1时可能保存部分结果。(使用字节数组)
然而,从更大的角度来看,从"/dev/urandom"
检索大量数据表明代码应该使用新方法
快速随机数。 "/dev/urandom"
需要时间来生成随机位。通常的方法是使用来自"/dev/urandom"
的位对种质PRNG进行种子设定,然后调用该PRNG。
或者,请考虑"/dev/random"
。
This post详细介绍。
答案 1 :(得分:0)
最终跟踪了这一点。似乎从dev / urandom重复读取可以重复结果。解决方案似乎是关闭文件重新打开并再次读取,或者从dev / urandom中读取1个大块