【问题标题】:What's the benefit of seeding a random number generator with only prime numbers?仅使用素数播种随机数生成器有什么好处?
【发布时间】:2011-07-16 22:06:42
【问题描述】:

在使用 Java 进行一些实验时,我的项目主管提醒我在实验的每次迭代中使用不同的编号。他还提到我应该使用素数作为种子值。这让我开始思考——为什么是素数?为什么没有其他数字作为种子?另外,为什么素数必须足够大?有任何想法吗?我自己会问他这个,但现在是凌晨 4 点,每个人都睡着了,我只记得这个问题,我很想知道答案(我相信你知道这种感觉)。

如果您能提供一些参考,那就太好了,我对这一切背后的数学/概念非常感兴趣!

编辑:

我正在使用 java.util.Random。

进一步编辑:

我的教授来自 C 背景,但我使用的是 Java。不知道这是否有帮助。使用素数似乎是他的特质,但我认为我们已经发现了一些关于生成随机数的有趣答案。感谢大家的努力!

【问题讨论】:

  • 我真的很想看看他是不是满脑子都是废话。特别是因为对于java.util.Random 之类的东西,与使用默认的基于时间的种子相比,这会大大减少可能的序列。
  • 听起来他把它和加密的东西搞混了。
  • 如果是用于实验,那么您希望它们具有可重复性并且以@Mark Peters 的方式(基于时间的方式)进行操作会很糟糕。质数可能是一种获得不同但确定性的起始值分布的方法。对于一个好的随机数生成器,只使用 1,2,3... 也应该这样做。
  • 关于我之前所说的关于使用质数缩小域而不是使用时间......两者都不相关。在接下来的一百万年中,长域中的素数是毫秒数的许多倍。我们也不会很快筋疲力尽。所以我不认为对种子值使用素数序列会影响熵,但我也不认为有充分的理由。
  • @Mark,java.util.Random 不使用System.currentTimeMillis(),而是类似:public Random() { this(++seedUniquifier + System.nanoTime()); } private static volatile long seedUniquifier = 8682522807148012L;

标签: java algorithm random seed


【解决方案1】:

如果您在谈论 java.util.Random,或者它在 Oracle 运行时中的子类之一,那么没有理由这样做。这只是你的主管的心血来潮。

【讨论】:

    【解决方案2】:

    如果生成器是 Lehmer 生成器,则种子和模必须互质;见the wiki page。确保它们互质的一种方法是从质数开始。

    【讨论】:

    • +1 指出它确实有所作为的案例:p
    • 我猜教授并不真正知道生成器是否是 Lehmer 生成器,但通常这样的建议来自以下模式:针对特定问题,某些事情是正确的,然后得到重新应用于不需要它的情况。除非这种模式确实会导致某些东西被破坏,否则一个人(或教授)可能需要很长时间才能费心检查他们要求的有效性。
    • 种子与某个秘密值互质的未记录要求将是java.util.Random中的严重实现缺陷...
    • OP 没有说明 java.util.Random 是有问题的生成器。
    • @Doug +1 非常酷!虽然我没有使用 Lehmer 生成器,但这肯定是一个令人印象深刻的努力(@Doug 我使用 java.util.Random)。明天可能只需要问他..叹息..希望我准时醒来..
    【解决方案3】:

    在实施过程中眨眼一下就会告诉你他根本没有任何理由提出这种说法。为什么?因为这就是 set seed 函数的样子:

    synchronized public void setSeed(long seed) {
        seed = (seed ^ multiplier) & mask;
        this.seed.set(seed);
        haveNextNextGaussian = false;
    }
    

    这正是构造函数调用的内容。所以即使你给它一个质数,它也不会使用它,所以如果你必须使用种子 s where (s^ multiplier) & mask 会导致质数;)

    Java 使用通常的线性同余方法,即:

    x_n+1 = (a * x_n + c) mod m with 2

    因为你想得到一个最大的周期,c 和 m 必须是相对质数和一些其他相当模糊的限制,加上一些技巧如何获得一个实用的版本。 Knuth 显然在第 2 部分中详细介绍了这一点;)

    但无论如何,种子根本不会影响生成器的质量。即使实现将使用 Lehmer 生成器,它显然会确保 N 是素数(否则该算法实际上是无用的;如果所有随机值都必须与非素数 NI 赌注互质,则不是均匀分布的),这使得没有意义

    【讨论】:

    • 这是正确答案:D。素数种子对默认的 java.lang.Random 没有影响。
    • 我非常相信使用素数是他的某种特质,因为很明显素数不会影响任何特殊的东西。此外,您关于 Lehmer 生成器的最后一点是有道理的——它似乎首先需要将素数视为 Lehmer 生成器!好努力!
    • 事实上,我认为使用素数会损害您的随机性,因为您可能会从一组有限的预定素数中提取,因此意味着您将拥有任意数量的种子。跨度>
    • @Chris 好吧,我的实验运行方式,我每次只需要固定数量的种子。嗯,我不相信在这种情况下使用素数会伤害我的随机性。然而,我相信它们不会有任何影响。
    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2019-07-16
    • 2016-07-22
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多