讨论,随机数问题。关于随机数种子的!牛人请进。在线讨论
今天我为了更加了解随机数种子的作用,做了些测试,结果发现了一些问题,和大家一起讨论一下。。
假如我们要产生1-9的随机数。你要随机9次刚好能不重复的随机出来。我以为只要随机数种子不同就可以做到了。结果。。。
出意料啊。发现以3作为随机数种子。随机出来的数范围是rand.Next(1, 10);【1-10】也就是随机1-9.结果随机出来的数也是3.还有如果以7作为随机数种子的话随机出来的数就是4.而以4做为随机数的种子那么随机出来的数就是7.
那如果你是随机数范围是有限的,随机数种子是无限的。这样的情况是不是不同的随机数种子也会随机出相同的数呢。
------解决方案--------------------那是肯定的。
种子只是保证相同的种子产生相同的序列。
------解决方案--------------------本帖最后由 caozhy 于 2011-05-13 10:34:30 编辑
我打一个比方说明种子是怎么产生序列的,当然真实的伪随机数算法比这个复杂多了。
假设伪随机数序列是这样的,取得平方根的小数部分作为序列
rndserial(seed) = 1 % sqrt(seed)
比如
种子等于2返回 4,1,4,2,1,3,5...
种子等于3返回 7,3,2,0,5,0,8...
种子等于5返回 2,3,6,0,5,7,9...
种子等于12返回 4,6,4,1,0,1,6... //显然和种子为2的时候重复
------解决方案--------------------
说明你对随机性没有正确认识。
如果产生1~10范围的10个随机数,前9个分别是1~9,最后一个是10的概率是多少?
显然还是0.1。
也就是说,10个随机数不重复的概率是A(10)/10^10,非常小的概率。
------解决方案--------------------
有几种算法:
记录下已经产生的随机数,然后遇到重复的,就跳过,再获取一个。
从一堆有序数中随机交换n次。
从一堆有序数中随机从位置n中取出一个,然后再在1-(n-1)里面继续取,递归。
------解决方案--------------------你的需求不是随机数问题,而是洗牌问题,一副牌,交换若干次顺序,变成另外一个随机序列。
------解决方案--------------------貌似要打起来了。。。。。。。。
------解决方案--------------------
什么叫随机次数?你产生了9次随机数。
------解决方案--------------------
所以我给你提供了很多算法。针对不同情况。
比如说你需要取的随机数不多,范围很大,那么完全可以直接在范围内选取,遇到重复的跳过。因为范围很大,重复的概率低,所以效率很高。
反之,范围和取的数量接近,用你的这个方法就很好。
------解决方案--------------------从头到尾说的都是洗牌算法,关概率P事...caozhy在白费口舌...楼主还是去学学高等数学吧...