日期:2014-05-17  浏览次数:21171 次

讨论,随机数问题。关于随机数种子的!牛人请进。在线讨论
今天我为了更加了解随机数种子的作用,做了些测试,结果发现了一些问题,和大家一起讨论一下。。
假如我们要产生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的时候重复
------解决方案--------------------
引用:
引用:
引用:
对啊。那么为什么不同的种子也可以产生相同是结果呢。

C# code

Random rand = new Random(5);
Console.WriteLine(rand.Next(1,10));
Random rand1 = new Random(7);
Console.WriteLine(rand……


说明你对随机性没有正确认识。
如果产生1~10范围的10个随机数,前9个分别是1~9,最后一个是10的概率是多少?
显然还是0.1。
也就是说,10个随机数不重复的概率是A(10)/10^10,非常小的概率。
------解决方案--------------------
引用:
我知道种子是保证序列不同。
我们又回到这个问题上来。
假如我们要产生10-99的随机数。你要随机89次刚好能不重复的随机出来
55,62,14,36,76,82····这样刚好。
这样控制随机器能做到吗?


有几种算法:
记录下已经产生的随机数,然后遇到重复的,就跳过,再获取一个。
从一堆有序数中随机交换n次。
从一堆有序数中随机从位置n中取出一个,然后再在1-(n-1)里面继续取,递归。
------解决方案--------------------
你的需求不是随机数问题,而是洗牌问题,一副牌,交换若干次顺序,变成另外一个随机序列。


------解决方案--------------------
貌似要打起来了。。。。。。。。
------解决方案--------------------
引用:
引用:
引用:
o(︶︿︶)o 唉。用二进制来控制随机数应该不错。就是要用办法控制出随机来的数据概率最小化。

随机序列产生的随机数是均匀分布的,不存在概率最小化这样的概念。

找一本概率论的书看看,感觉你一点基础知识都没有。

我说控制。懂吗?我说个例子

C# code

List<int> ary = n……

什么叫随机次数?你产生了9次随机数。
------解决方案--------------------
引用:
对,我就是要这样,这样产生9次。是每次都没有随机出相同的数。不过我这样的方法对于范围宽了。性能不用提就知道有多差。所以我想知道是不是有控制随机器产生的数就是这样的。


所以我给你提供了很多算法。针对不同情况。

比如说你需要取的随机数不多,范围很大,那么完全可以直接在范围内选取,遇到重复的跳过。因为范围很大,重复的概率低,所以效率很高。

反之,范围和取的数量接近,用你的这个方法就很好。
------解决方案--------------------
从头到尾说的都是洗牌算法,关概率P事...caozhy在白费口舌...楼主还是去学学高等数学吧...