首页
社区
课程
招聘
[原创]计算机为什么能生成随机数
2014-2-6 14:59 8680

[原创]计算机为什么能生成随机数

2014-2-6 14:59
8680
  有一种论调说是计算机是有限状态机不能生成随机数,实际上我们找不到这样严密的东西。在这里我们告诉不相信计算机能生成随机数的人一个方法如何从计算机得到随机数。这个方法不能高效的生成随机数,用它旨在说明问题,实际方法多得是但多是不太简单,说起来啰嗦。
  随便使用一种语言编个小程序即可得到随机数。找个小的可执行程序A(一个空的可执行文件),我们用编的程序去连续调用程序A,并且用现成的时间函数来计量程序A的运行时间(时间单位用毫秒),将运行时间做成一个数组,得到a1,a2,...,an,共n个数据,让后计算它们的平均值p,然后让每个数组成员依次减p,得到另一个数组,做一个统计凡是大于或等于0的计一个数1,凡是小于零的计一个0,这样得到的由0和1组成的数组可以作成了一个 n位的二进制随机数。一直算下去你就会发现,根本无法预测下一个数是1还是0,而随机数就这样产生了。
  不相信的人可以自己实践一下,很简单的。

效率较高的随机数生成方式一例:
  采用高精度的时间戳函数,可以轻而易举的获得随机数。例如测试一个函数的运行时间得到:
3.254924718072082毫秒
4.3321148358227468毫秒
2.61374001444418166毫秒
9.5216012090908571毫秒
..............................
截取上面变化数据的中段,经处理就可以得到随机数了。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
打赏
分享
最新回复 (18)
雪    币: 80
活跃值: (99)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
sunnysab 2014-2-6 15:16
2
0
这精度也太高了吧……

那什么验证码等图片都有个参数,通常是0.xxxxxxxxx……,是用rand()生成的,想知道是怎么回事,从0开始
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
bujin888 4 2014-2-6 17:20
3
0
1.防止浏览器缓存
2.适当时候可以当成验证密钥传输
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rqqeq 2014-2-6 17:54
4
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whnet 2014-2-6 19:15
5
0
楼主你没有搞懂什么叫随机数。

你也没有理解 你标题中的“计算机不能产生随机数”的概念。
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
idoiter 2014-2-6 19:29
6
0
严格来讲叫伪随机数吧。
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lovelyday 2014-2-6 19:58
7
0
那怎么证明这样生成的就是随机数呢?
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-2-6 21:36
8
0
  随机数是无规律的数,不可预测,不能重复产生。
  实际上真随机数组是不存在的,因为一旦拿出来就是已知的了,真随机数只存在于发生机制中,你如果不能预测其下一个元素是什么,那就是真随机数。
雪    币: 211
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
baiyik 2014-2-6 22:03
9
0
题外话:-_-

我记得以前还有个真随机发生器的玩意,好像可以取到相对的真随机数。

真随机在bp网络,深度学习网络里比较重要。
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-2-6 22:14
10
0
  投硬币能产生随机数,但如果你胡猜可能有一半能猜对,但你如果能准确猜对才能说明它不是随机数。
雪    币: 40
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
青v云 2014-2-6 22:29
11
0
很看好LZ的潜力, 预计LZ不久就能证明出各种大数学家们也搞不定的猜想了
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
没有姓名 2014-3-10 00:46
12
0
正常情况下,楼主给出的那个是高斯正态分布的抽样吧,不是均匀分布……
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cnxxm 2014-3-10 01:52
13
0
楼主想的太简单了
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
RtlFree 2014-3-10 08:24
14
0
这样产生的依然不是随机数, 可以计算出来
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-3-12 14:30
15
0
  楼上说能算出来,不知能算出来什么,能说说吗?
  第一种方式中程序的运行时间测试如果比较一致,你可以找个运行时间更长一点的试试,总是能生成随机数的。
  第二种方式更是不容质疑,小数位肯定是不同的否则将是奇迹了。
雪    币: 148
活跃值: (59)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
SupRole 2014-3-13 23:21
16
0
楼主取随机源的方式靠3点,两次获取时间之间执行的指令数量、cpu的运行频率、时钟中断次数
它们都无法得到真随机源
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cnxxm 2014-3-14 01:21
17
0
此 随机  ,非 彼随机。  楼主认为的随机,不是我们所想的那种随机。
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
RtlFree 2014-3-14 07:05
18
0
两种 方法都一样. 都是依赖 运行时间. 不管是 函数,还是进程 , 运行时间总是依靠CPU时钟周期.是确定的,后面再怎变换, 结果也不是随机的.
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-3-14 15:29
19
0
  楼上说的不错是有这些因素。但随机数的生成的本质是事件驱动造成的,计算机驱动某一事件,对事件的执行不是完全确定的,所以计算机又去调整控制,这样随机性就显露出来,需要做的只是如何提取而已。
游客
登录 | 注册 方可回帖
返回