3

在思考这个问题并与参与者交谈时,出现了一个想法,即对一组有限的明显有偏差的随机数进行洗牌会使它们随机化,因为你不知道它们被选中的顺序。这是真的吗?如果是这样,有人可以指出一些资源吗?

编辑:我想我可能有点不清楚。假设一个坏的随机数生成器。取 n 个值。这些是有偏见的(rng 不好)。有没有办法通过改组使多次试验的 rng 输出在统计上与已知良好 rng 的输出相匹配?

4

7 回答 7

8

错误的。

有一个简单的测试:假设原始集合创建算法中的偏差是“创建算术平均值显着低于预期平均值的集合”。显然,改组算法的结果不会改变平均值,因此不会消除偏差。

另外,关于您的说明:您将如何洗牌?使用最初创建集合的错误 RNG 的相同错误输出?还是使用更好的RNG?这就提出了为什么你不直接使用它的问题。

于 2009-01-23T12:24:36.620 回答
3

不是真的。在另一个问题中,问题是在 [1..9] 中选择 30 个随机数,总和为 200。在平均随机选择大约 20 个后,您会达到无法再选择 9 的程度,因为这会使总和超过 200。在剩下的 10 个数字中,大多数是 1 和 2。所以最后,在选定的数字中,一和二的比例非常高。洗牌不会改变这一点。但目前尚不清楚随机分布到底应该是什么样子,所以可以说这是一个很好的解决方案。

一般来说,如果你的“随机”数字会偏向于,比如说,低数字,那么无论排序如何,它们都会以这种方式产生偏差。

于 2009-01-23T12:22:10.540 回答
0

错误的

集合是有限的,假设由n数字组成。如果你选择n+1数字会发生什么?让我们还考虑一个在许多语言中实现的基本随机函数,它给你一个随机数[0,1)。但是,此数字限制为小数点后三位数字,为您提供一组 1000 个可能的数字 ( 0.000 - 0.999)。但是,在大多数情况下,您不需要使用所有这 1000 个数字,因此这种随机性已经绰绰有余。

但是对于某些用途,您将需要比这更好的随机生成器。所以这一切都归结为你需要多少随机数,以及你需要它们有多随机。


阅读原始问题后补充:如果您有某种限制(例如在原始问题中,每组选择的数字必须相加一定),您本身N并不是真正选择随机数,而是选择给定集合中随机顺序的数字(具体而言,数字的排列总和为)。N


添加到编辑:假设您的错误数字生成器生成了序列(1,1,1,2,2,2)。排列是否(1,2,2,1,1,2)满足您对random的定义?

于 2009-01-23T12:11:30.577 回答
0

只是洗牌一组已经随机数的数字当然不会对概率分布产生任何影响。那将意味着错误。也许我误解了你的问题?

于 2009-01-23T12:13:46.297 回答
0

我会说假的,但要注意:

我认为有随机,然后有“足够随机”。对于我需要处理的大多数应用程序,“足够随机”已经绰绰有余,即从大约 300 个已付费放置在该网站上的列表中选择一个“随机”广告显示在页面上。

我确信数学家可以证明我非常基本的“随机”选择标准根本不是真正随机的,但实际上是可以预测的——对于我的客户和用户来说,没有人在乎。

另一方面,如果我正在编写一个在拉斯维加斯使用的视频游戏,那里手头有大量资金,我会以不同的方式定义随机(并且可能很难找到真正的随机)。

于 2009-01-23T12:17:16.603 回答
0

完全不真实:洗牌不会消除偏见,它只是将其隐藏在不经意的观察者面前。这就像只是推到沙发底下从地毯上取下你的狗精心准备的礼物 - 你真的没有解决问题,你只是让它变得不那么引人注目。有鼻子的人都知道,还有一个问题需要解决。

随机性必须在整个范围内均匀应用,所以这是一种方法(在我脑海中,有很多假设,yadda yadda。关键是方法,而不是代码 - 从一切开始,然后引入你的随机性一个一致的方式,直到你完成。现在唯一的偏见取决于为“目标”和“数字数量”选择的值,这是问题的一部分。)

target = 200
numberofnumbers = 30
numbers = array();
for (i=0; i<numberofnumbers; i++)
  numbers[i] = 9
while (sum(numbers)>target)
  numbers[random(numberofnumbers)]--
于 2009-01-23T13:19:00.020 回答
0

错误的。考虑一个只产生零的坏随机数生成器(我说它是的:-) 再多的改组零不会改变该序列的任何属性。

于 2011-07-22T21:30:00.977 回答