gpt4 book ai didi

c - 从 dev/urandom 获取真正随机的数据

转载 作者:行者123 更新时间:2023-11-30 18:36:22 26 4
gpt4 key购买 nike

我正在循环中读取 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

最佳答案

Am I doing something very wrong here?

是的,代码在使用 rand 时没有首先检查 read(myFile, &rand, 2) 的返回值。

<小时/>

代码读取时遇到问题,因此请检查read()的返回值。

if (read(myFile, &rand, 2) != 2) Handle_It();
else printf("%d " , (int) rand) ;

总是2吗?我怀疑代码不耐烦 - 代码只需要等待并在返回值 < 2 时重试,当返回值为 1 时可能会保存部分结果。(使用字节数组)

<小时/>

然而,从更大的角度来看,从 "/dev/urandom" 检索大量数据表明代码应该使用一种新方法快速随机数。 “/dev/urandom”需要时间来生成随机位。通常的方法是播种质量 PRNG使用来自 "/dev/urandom" 的位,然后调用该 PRNG。

或者,考虑“/dev/random”

<小时/>

This post进入更多细节。

关于c - 从 dev/urandom 获取真正随机的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42093843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com