【问题标题】:How do i generate a pair of random values relative to an incrementing seed?我如何生成一对相对于递增种子的随机值?
【发布时间】:2013-05-02 20:37:57
【问题描述】:

我有一个包含 200 行和 200 列的网格。 我想通过使用数字种子生成随机坐标对 i,j。这个种子是我每次生成一对数字时递增的值。

在生成 40,000 个值后,所有坐标对彼此之间都是唯一的,因为没有 i,j 和 m,n,其中 i=m 和 j=n。

例如:

seed 0: generates 43,12
seed 1: generates 154, 62

等等……

种子意味着相同的输入具有相同的功能会产生相同的结果,我很好。

我知道我需要某种伪随机算法,因为使用计算机时间或其他东西可能会生成两个相同的对,但我从哪里开始呢?

【问题讨论】:

    标签: node.js math


    【解决方案1】:

    如果您希望每个种子返回一个随机点,并且所有这些点都是唯一的,那么最简单的方法是将这些点放入一个数组中,打乱数组,然后使用整数种子来索引洗牌数组。例如,seed=0 将获得任何碰巧被洗牌到第一个位置的元素。

    让整数表示对我来说似乎更容易一些,所以制作一个从 0 到 40000(即 200x200)的数组,将其随机排列,然后使用 0 到 40000 范围内的种子。要转换整数, n,点对使用,i=n%200j=(n-i)/200

    当然,由于您希望每个种子返回一个唯一点,因此您的种子数必须等于或少于点数,

    【讨论】:

    • 这有潜力,但我不想制作一个从 0 到 40k 的置换数组。种子从 0 开始,每次创建一对时递增。如果我将种子与大质数相乘可能会奏效。今晚我将对其进行测试并返回我的结果。
    • 我不认为你的 RNG 的种子是问题:种子 0 和 1 的随机数应该与种子 0 和 873391 的随机数不相关,或其他。相反,您的问题是碰撞。可以这样想:你有一盒编号为 0 到 40K 的球。您选择一个,写下数字,然后将其放回原处。在两次得到相同的数字之前写下所有数字的机会非常小。 (想想你快到了,还有一个你还没有写下来,从盒子里准确地挑选出这个的机会是 40K 中的 1 个。)
    【解决方案2】:

    您需要一个可以为其设置种子值的随机数生成器。好像你知道这一点。你不能为Math.random() 设置种子,但是那里有很多伪随机数生成器。我建议你看看seedrandom.js

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 2022-01-06
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多