2013-04-29 15 views
-1

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

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

例如:

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

等等...

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

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

回答

-1

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

+0

但如何让他们独特之处? – Discipol 2013-04-29 20:52:29

1

如果你想让每个种子返回一个随机点,并且所有这些点都是唯一的,最简单的方法就是把这些点放在一个数组中,随机数组,然后使用整数种子来索引混洗阵列。例如,seed=0会得到任何发生混乱的元素进入第一个位置。

让我看起来更容易让整数表示对,所以从0到40000(即200x200)的数组,然后洗牌,然后使用0到40000范围内的种子。要将整数,n,点对使用,i=n%200j=(n-i)/200

当然,既然你想每个种子返回一个独特之处,你必须比点的数量等于或更少的种子,

+0

这有潜力,但我不想做一个从0到40k的排列数组。种子从0开始,并在每次创建一对时递增。如果我用一个大素数乘以种子可能会有所斩获。我会在今晚进行测试,并返回我的结果。 – Discipol 2013-04-30 06:43:18

+0

我不认为你的RNG的种子是问题:种子0和1的随机数应该与种子0和873391或任何其他数不相关。相反,你的问题是碰撞。可以这样想:你有一盒编号为0到40K的球。你选择一个,写下数字,然后重新输入。在两次获得同一个数字之前写下所有数字的机会,天文数字很小。 (考虑到你差不多在这里,还有一个你没有写下来,从盒子中挑选这一个的机会在40K是1。) – tom10 2013-04-30 16:32:50