首页
社区
课程
招聘
[原创]一种利用计算机生成随机数的方法
2014-1-31 08:13 4662

[原创]一种利用计算机生成随机数的方法

2014-1-31 08:13
4662
一种利用计算机生成随机数的方法
  这里介绍一种利用计算机生成随机数的方法,微机都有系统计数器记录自运行开始以来的脉冲数,这是个规律变化的数字,只用它是不能产生随机数的,但是如果我们对计数值进行随机采样则可以得到随机数输出,方法是借助一个性能优良的随机函数,例如我们要生成N个随机数,我们建立N次循环,在循环内用函数读取系统计数值作为随机函数的种子(也许不止一个),然后将随机函数的值作为输出。这样循环结束就可以得到N个随机数了。
  计数值采样函数,只用低32位值就够了,高位变化缓慢没有利用价值。试验证实即便是连续采样也不会读到相同的数值,所以不同循环内的读值更不同了。由于采到的计数器值是千变万化的,所以随机函数的种子是千变万化的,随机函数的输出自然也是千变万化的。方法虽然使用了随机函数,但和这个随机函数所能提供的随机序列毫无关系,只是间接利用而已,这样生成的随机序列是没有周期的,永不重复的。
  以字节为单位的随机数组输出,在一般微机上能达到大约40M字节/s的输出。实验证实结果数组各元素是独立的,经多次差分处理数据依然是毫无规律的。
  下面的小程序运行后能产生10M字节的数据,放在rand.txt里。
http://clip2net.com/s/270uC

设置随机函数A种子------>计数器采样值 + 系统时间等
//--------------------生成数据的循环

  生成数据序列值 = 随机函数A的值

  根据条件1 设置 随机函数A的种子值 包括计数器采样值和其它因素

  根据条件2 设置 随机函数A的种子值 包括计数器采样值和其它因素
              ......,,,,,,

//--------------------生成数据的循环

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
打赏
分享
最新回复 (4)
雪    币: 80
活跃值: (99)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
sunnysab 2014-1-31 10:25
2
0
只有BIN?我这速度300M+/S
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
AioliaSky 1 2014-1-31 15:08
3
0
问题是随机函数怎么保证100%随机?
用系统脉冲数作为随机因子吗?这明显也是一种伪随机
因为系统脉冲数是随规律不断自增的,这个规律当然就是CPU的时钟频率
而CPU的时钟频率是固定的,自然不会随机改变时钟频率
那也就是说,用系统脉冲数作为随机因子生成的伪随机数也是从有规律可循转变过来的
这就显然无法保证100%随机
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rqqeq 2014-1-31 17:34
4
0
还是伪随机哎……冒得意思……不比以时间做随机因子先进
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sjdkx 2014-2-1 09:11
5
0
  若认为得到的数据随机性有问题,请找到其规律性的表现,找不到的话就不要臆想了。若能找到规律并能从前面的数据得到后面的数据,那样就可以证明此种方法毫无意义,希望能者能用数据说话。
  计数器采样值只是随机函数的种子的一部分,另外还可以设置多个变量的累乘、累加或其它随机函数的值并连同前面的数据输出杂凑出种子的其它部分,这样随机函数只是一个跳板而已,这样的设置即使有规律可能也难于复现。
游客
登录 | 注册 方可回帖
返回