Chinaunix

标题: 设计一个完美的随机数 [打印本页]

作者: qingfengjianke    时间: 2008-02-19 10:31
标题: 设计一个完美的随机数
假如我想写一个在线博彩系统,如何写一个完美的随机数?



网站博彩系统,大部分应该采用

DateTime.Now.Ticks  做为随机种子:

(此属性的值表示自 0001 年 1 月 1 日午夜 12:00:00 以来已经过的时间的以 100 毫微秒为间隔的间隔数。


所以产生数字一样的条件是:
1,运行在电脑启动的同一毫微秒数.或最大种子的基数倍(相同的种子)
2,使用相同的随机数算法,最好是同版本的编译器编译出来的程序(相同的算法)


-------------------

所以,在了解 在线博彩算法的前提下, 将 某个时刻的 毫微秒间隔数做种子,就可以推算出系统开出的号码.


2008.02.21 00:00:00 的毫微秒间隔数为:

633391488000000000

[ 本帖最后由 qingfengjianke 于 2008-2-21 09:44 编辑 ]
作者: tianshanxue2005    时间: 2008-02-19 10:35
不用写了,Linux里面系统有/dev/random,/dev/urandom向用户提供随机数
作者: qingfengjianke    时间: 2008-02-19 10:39
那现在已经存在的在线博彩系统大多数是采用哪种方式?
选取伪随机数的种子?
作者: Wind-Son    时间: 2008-02-19 10:44
完美的随机数掌握在上帝手里
作者: tianshanxue2005    时间: 2008-02-19 10:45
那就不知道了,不了解博彩系统。
像C语言里面用的是伪随机数,Linux内核提供了理论上的真随机数,详见:Linux内核设计与实现的附录。
作者: qingfengjianke    时间: 2008-02-19 10:47
   谁了解现在已有的在线博彩系统,采用哪种方式啊?
这种::
srand(time(0));
rand();   ????







转:::::
在windows平台下,可以考虑将如下参数作为影响种子的因素。



1.GetTickCount()
系统启动以来的嘀嗒时间
说明:该时间与系统运行时长相关,
2.GetCurrentProcessId()
当前进程Id号
说明:该Id与系统启动进程数量及次序有关,一般波动范围较小。
3.GetCurrentProcess()
当前进程句柄
说明:该句柄实质就是内存地址,但每次进程启动时地址值是不确定的。


4.GetProcessTimes()   
进程时间参数
说明:-


5.GetCurrentThreadId()
当前线程Id号


6.GetCurrentThread()
当前线程句柄


7.GetThreadTimes()
线程时间参数


8.GetCurrentHwProfile()
Profile配置文件


9.GetSysColor()
系统Color


10.GetSystemInfo()
系统信息


11.GetSystemPowerStatus()
电源状态


12.GetKeyboardState()
键盘状态


13.GlobalMemoryStatus()
内存状态


14.time()
当前时间 秒


15.GUID
各硬件设备GUID


16.MAC
网卡mac


17.CPUID
CPU Id号


18.声卡录音噪音
该参量与环境相关


19.用户键盘间隔时间
该参量与用户习惯相关
作者: langue    时间: 2008-02-19 12:32
完美是找不到的,不过从你的需求来看随便找个 HMAC 作为 PRF 应该就行了
作者: MMMIX    时间: 2008-02-19 12:47
嘛是“完美的随机数”?
作者: Sorehead    时间: 2008-02-19 13:35
标题: 回复 #8 MMMIX 的帖子
就是那种非不完美的随机数
作者: Edengundam    时间: 2008-02-19 15:01
有穷状态机还没有算法可以生成高质量的随机数.

推荐个网站给你: http://random.irb.hr/

免费随机数. 需要注册, 回答一道简单的数学题就ok了.
作者: MMMIX    时间: 2008-02-19 20:39
原帖由 Sorehead 于 2008-2-19 13:35 发表
就是那种非不完美的随机数


作者: 醉卧水云间    时间: 2008-02-19 20:42
用量子方法可以产生完美随机数,已经搞出来了。
作者: qingfengjianke    时间: 2008-02-20 08:49
   有人了解现在的博彩站点大部分都采用哪种方法吗?

是采用计算机启动的时间(毫秒)做为种子吗?
作者: tianshanxue2005    时间: 2008-02-20 09:26
难道lz要破解博彩站点,买彩票中大奖??
作者: qingfengjianke    时间: 2008-02-20 09:30


有这个想法,如果,不采用随机的物理现象做种子,
都可以逆向推理的.
作者: tianshanxue2005    时间: 2008-02-20 09:35
看来lz非常明白
作者: qingfengjianke    时间: 2008-02-20 11:28
验证确定,现在大部分站点所产生的验证码,随机数等等,
大部分采用系统启动时间的毫秒数做为随机种子,

Random(unchecked((int)DateTime.Now.Ticks));

   

毫秒级别的数字,要想逆推难度较大.....
作者: cheng_lai_shun    时间: 2008-02-20 12:01
原帖由 MMMIX 于 2008-2-19 12:47 发表
嘛是“完美的随机数”?


就是那种可以中500W的,呵呵。。。。
作者: greensnow    时间: 2008-02-20 12:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: galaxywar    时间: 2008-02-20 13:01
原帖由 qingfengjianke 于 2008-2-20 08:49 发表
   有人了解现在的博彩站点大部分都采用哪种方法吗?

是采用计算机启动的时间(毫秒)做为种子吗?

以前是有过一个随机算法被人知道了的事件,不过记不清了.

完美的随机数需要某些物理现象的随机输入,比如某个外设的电平变化,用户上次敲的两个键之间的时间间隔.
作者: roger0922    时间: 2008-02-20 15:48
原帖由 cheng_lai_shun 于 2008-2-20 12:01 发表


就是那种可以中500W的,呵呵。。。。

- -+想法非常诱人
作者: zdafan    时间: 2008-02-21 04:11
可以参考PuTTYgen,让用户移动鼠标达到一定的长度,之后把鼠标的运动轨迹转化为种子。
作者: MMMIX    时间: 2008-02-21 09:12
原帖由 galaxywar 于 2008-2-20 13:01 发表

以前是有过一个随机算法被人知道了的事件,不过记不清了.

完美的随机数需要某些物理现象的随机输入,比如某个外设的电平变化,用户上次敲的两个键之间的时间间隔.

这些东西真的是随机的么?我的意思是“真正的随机”,而不是看起来随机或者说你无法预测
作者: haterw    时间: 2008-02-21 09:15
根本不存在什么随机数,所有一切都是必然的
作者: 虎皮尖椒    时间: 2008-02-21 09:30
0/1的世界里哪有随机啊?
作者: galaxywar    时间: 2008-02-21 10:48
原帖由 MMMIX 于 2008-2-21 09:12 发表

这些东西真的是随机的么?我的意思是“真正的随机”,而不是看起来随机或者说你无法预测

拿那些东西作种子就行了.
不过"真正的随机"是什么意思?
作者: qingfengjianke    时间: 2008-02-21 10:59
  选取某个不断变化不可预料的物理现象做为种子,可认为真正的随机,

除此之外,都是伪随机
作者: 柳拂风    时间: 2008-02-21 11:31
电子云好像是真正随机的
作者: cugb_cat    时间: 2008-02-21 11:35
自然界中的现象基本都是有规律,都是符合某种分布的,想做到完全均匀的随机,好像不可能。
作者: redspider    时间: 2008-02-21 11:47
这似乎不是计算机科学的研究范畴,应该属于哲学或物理学范畴
作者: songtebo    时间: 2008-02-21 11:56
可以用openssl里面的代码,随机性很好。


通过鼠标键、屏幕可以得到最初状态。我这里有一个USB接口的硬件随机数生成器,几十元,便宜:)

扩大状态机的空间,这个很容易做到,当将5K内存作为种子的时候,理论上就是真得不能再真的随机数了。

运行中,有各种事件发生,也可以每隔一段时间向硬件随机数生成器申请一个,推动状态机改变。


停止运行前,保存状态,再次启动后,立即更新状态。
作者: arthurzf    时间: 2008-02-21 20:16
Random.org这个网站就提供了真正的随机数序列,他通过大气噪音 (Atmospheric Noise) 这种大自然的随机现象来产生
作者: system888net    时间: 2008-02-21 23:42
up
作者: MMMIX    时间: 2008-02-22 09:19
原帖由 柳拂风 于 2008-2-21 11:31 发表
电子云好像是真正随机的

who knowns
作者: MMMIX    时间: 2008-02-22 09:21
原帖由 galaxywar 于 2008-2-21 10:48 发表

拿那些东西作种子就行了.
不过"真正的随机"是什么意思?

就是完全没有规律,即使全知全能的上帝也无法预测。BTW,这里有个矛盾
作者: runforu    时间: 2008-02-22 09:42
标题: 没有绝对的随机,全是伪随机!!
任何随机都是伪随机,好像数学家也正在证明这个问题。但是迄今为止找不到真随机。整个世界都这样。
作者: twtdata    时间: 2008-02-22 15:49
标题: 可以买一个随机数发生器。
不是程序上的。是电子运动产生的。
作者: safedead    时间: 2008-02-22 16:39
RSA的书上介绍过一种随机数发生器
利用劣质内存芯片工作在高温下,其数据是变幻无常的
读取这里面的数据,就会得到难以预测的随机数
有采用用这种技术制作随机数发生器板卡

用过早期486电脑的都知道,那个时代普通PC机都要上ECC内存
否则根本没法用,内存数据经常没准
空调也要好,不然连CPU都会瞎算数
作者: safedead    时间: 2008-02-22 16:50
原帖由 MMMIX 于 2008-2-22 09:19 发表

who knowns



电子云是可计算的空间概率的,并非均匀分布
真要是均匀分布,受热发光可就是完美连续光谱了
光谱学证明电子只能处于非连续的特定能级(运行状态)
作者: star_in_sky    时间: 2008-02-22 16:55
如果樓主用Java寫的話, 可以使用java.security.SecureRandom 產生真正的隨機數.
如果用C/C++寫的話:
在Linux平台: 2樓的兄弟(tianshanxue2005 骑士)說的是對的. 用:Linux里面系统有/dev/random,/dev/urandom向用户提供随机数
在Windows平台: 用
CryptGenRandom 函數產生真正的安全的隨機數.

如果你用rand/srand之類的函數, 呵呵, 告訴你不會存在完美的隨機數(無論你的種子如何取); 用程序可以輕鬆的預測你的隨機值.
作者: zarra    时间: 2008-02-23 12:48
所有物质都在不断运动 所有运动都有着运动规律 这是唯物辩证的基本认识
在此基础上 静止和随机就是两个永恒的假命题

随机现象只是人们对于物质运动规律认识的匮乏,而产生的主观意识。它会随着人们对于运动规律的认识加深而不断减少

在牛顿以前 机械运动也可以算是随即现象 。而现在,上万年后的天文历法都可以演算出来。
关于电子云,根据量子力学的测不准原理 它的任意时刻的状态是存在的 只是不能被人类所测得 随着理论和技术的发展 人类终将掌握其规律

根据唯物辩证的理论
计算机系统上的任何随即数发生器都是伪随机的
c语言中的random函数使用一个整数和线性同余算法来发生,这是简单的规律,已被人充分认识 所以被称为伪随即数函数
所谓完美的随即数发生器就是尽可能的模拟一个有着复杂规律的运动 或者是 采集目前不为人所掌握规律的运动数据 来产生结果。
它的完美性是有暂时的,会随着技术的发展和认识的加深而丧失

[ 本帖最后由 zarra 于 2008-2-23 12:50 编辑 ]
作者: 光能    时间: 2008-02-24 07:48
路过回帖!!!!!!!!!!!!
作者: lvziwei    时间: 2008-02-24 11:56
无语。。。。
作者: fiftymetre    时间: 2008-02-24 15:43
在线博彩算法的前提下, 将 某个时刻的 毫微秒间隔数做种子,就可以推算出系统开出的号码.

晕哟
作者: qingfengjianke    时间: 2008-02-25 09:40
   自己顶一个,对随机数有更深研究的朋友 尽可 言论
作者: Lonki    时间: 2008-02-25 12:22
LZ的初衷应该是找一个伪随即数算法, 同时自己也能计算出:>
作者: qingfengjianke    时间: 2008-02-25 13:15
我想找一个现在博彩 网站的随机数算法,推算出他们网站的开奖号码

比如 pceggs.com里面的幸运28游戏!
作者: graydream    时间: 2008-02-25 17:22
完美随机数需要硬件支持,简单说就是用一只猴子装一个usb口作为种子。
为了防止猴子睡觉,可以用三只猴子分别放在全球的三个时区。当然了,要准备足够的香蕉。
作者: kakasi    时间: 2008-02-28 17:41
原帖由 qingfengjianke 于 2008-2-25 14:15 发表
我想找一个现在博彩 网站的随机数算法,推算出他们网站的开奖号码

比如 pceggs.com里面的幸运28游戏!


且不论真随机数是否存在,问题是博采的网站使用了所谓的真随机数吗?如果你碰不到它的硬件,接触不到它的程序,上面提到的任何一种伪随机你都无法模拟再现——因为你根本就拿不到种子。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2