【问题标题】:Generate a random number from another number从另一个数字生成一个随机数
【发布时间】:2013-05-20 17:16:06
【问题描述】:

在 JavaScript 中,是否可以从另一个数字生成随机数?

我正在尝试为我的一个分形地形生成器实现一个可预测的随机数生成器。我已经知道可以使用 Math.random() 生成一个随机数,但我想创建一个随机数生成器,它为每个输入生成一个输出。 (例如,predictableRandomGenerator(1) 将始终产生相同的结果,不一定与输入相同。)

那么是否有可能从另一个数字生成一个随机数,其中每个输入的输出总是相同的?

【问题讨论】:

标签: javascript random


【解决方案1】:

如果您需要用于地形生成器的 PRNG,那么我假设您需要一个种子随机数生成器,该生成器可以为给定种子再现伪随机数序列;这样每个种子都会创建一个单独的、独特的地形,以后可以通过提供相同的种子来重建。

这可能对你有用:

http://davidbau.com/archives/2010/01/30/random_seeds_coded_hints_and_quintillions.html http://davidbau.com/encode/seedrandom.js

【讨论】:

    【解决方案2】:

    当然,身份函数怎么样:

    function getMappedRandom(random){ return random; } 
    

    我不确定您为什么要进行这种转换,但就随机性而言,它不一定会使它变得更好。

    【讨论】:

    • 这将简单地将输入作为输出返回。它仍然被认为是伪随机的吗?
    • @AndersonGreen:顺便说一句,如果你是诚实的,你应该接受这个。这是对您提出的问题的最准确和正确的答案。
    • @thg435 从技术上讲,这将被视为一种随机数生成器,但将其输出作为输入返回的伪随机数生成器可能比大多数其他随机数生成器“随机”少得多,由statistical randomness tests 判断。也许我的问题的原始措辞具有误导性,因为它似乎暗示我希望随机数生成器将其输入作为输出。
    • @AndersonGreen:问题是如何从另一个数字生成随机数,答案return 9 是完全正确的。随机的属性不适用于单个对象,因此一个数字与另一个数字一样随机。它只是一个可以随机或不随机的数字序列。
    • @thg435,漫画不是原始答案的一部分。那是我的补充。我认为看看原始回答者如何使用身份功能是合适的。 =)
    【解决方案3】:

    您可以使用校验和生成器(例如 MD5 或 SHA-1)为每个输入生成单个伪随机输出。 SHA-1 将从作为输入输入的每个字符串生成一个随机数,并且每个输出将恰好产生一个输入。 (很可能任何其他校验和生成器也适用于此目的,因为校验和生成器为输入的每个输入生成一个输出)。

    【讨论】:

    • 这里最大的警告是,像 MD5 和 SHA-1 这样的校验和算法本质上被设计为 slow。您真正想要的是种子伪随机数生成算法。此处的关键字是种子,即您所指的那个“起始编号”的技术术语。
    • 请不要将 StackOverflow 用作您的个人博客。本网站用于询问真正的编程问题,而不是与世界分享您的发明。
    • @AndersonGreen:是的,如果您有关于实际编程问题的实际问题,可以自行回答问题。不是你认为我们需要知道的一些随机想法。
    • @thg435 这个问题讨论了一个真正的编程问题。它询问如何实现一个随机数生成器,其输出很容易被复制。
    【解决方案4】:

    是的,这是可能的。但是,您需要编写自己的伪随机数生成器。

    您看,计算机并不能真正生成随机数。但是,您可以使用一种算法来创建看似随机的数字序列。

    这个算法通常被赋予一个种子,每个种子导致该算法生成的不同随机数序列。

    最常见的算法是线性同余伪随机数生成器,由 D. H. Lehmer 定义并由 Donald E. Knuth 在计算机编程艺术,第 2 卷:半数值算法,第 3.2.1 节中描述。​​

    更多详情请参考以下话题:Predict the Seed of Javascript's Math.random

    【讨论】:

    • 使用现有的哈希函数(例如 SHA-1、SHA-2 或 SHA-3)可能比从头开始更容易。
    【解决方案5】:

    我相信你需要的是单向哈希函数。试试 hex_md5() 或 hex_sha1()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-21
      • 2023-01-03
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2018-04-03
      • 2020-06-29
      • 1970-01-01
      相关资源
      最近更新 更多