【问题标题】:Shuffling biased random numbers改组有偏随机数
【发布时间】:2009-01-23 12:02:37
【问题描述】:

在思考this 问题并与参与者交谈时,我们想到了将一组有限的明显有偏随机数的随机数随机化,因为您不知道它们被选中的顺序。这是真的吗?如果是这样,有人可以指出一些资源吗?

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

【问题讨论】:

    标签: shuffle random


    【解决方案1】:

    错误。

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

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

    【讨论】:

      【解决方案2】:

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

      一般而言,如果您的“随机”数字会偏向于(例如)低数字,那么无论排序如何,它们都会以这种方式偏向。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我会说假的,但要注意:

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

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

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

          【讨论】:

          • rng 的偏差与之后应用的转换函数的偏差之间存在差异,以使房子获胜。
          • “拉斯维加斯”风格的软件使用非常可靠的随机 PRNG 算法或 RNG 硬件。有法律和严格的审计程序来确保这一点。确保房子获胜的是规则而不是游戏的随机性。
          【解决方案5】:

          错误

          集合是有限的,假设由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 的定义?

          【讨论】:

          • 一个完美的quantum-magic-rng可以产生序列(1,1,1,1,1,1)。有可能
          【解决方案6】:

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

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

          target = 200
          numberofnumbers = 30
          numbers = array();
          for (i=0; i<numberofnumbers; i++)
            numbers[i] = 9
          while (sum(numbers)>target)
            numbers[random(numberofnumbers)]--
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-02-16
              • 1970-01-01
              • 2013-03-23
              • 1970-01-01
              • 1970-01-01
              • 2019-11-08
              • 2013-07-29
              相关资源
              最近更新 更多