伪随机数生成

pseudo random number generation

我在我的游戏中生成一个随机数使用:

System.Random rnd = new System.Random ();
int TileType = rnd.Next (0, 8);

问题是数字太随机了。这些数字与瓷砖有关,我没有得到 20 卷的特定瓷砖。

我需要有关制作生成 "fake" 随机数的函数的指导。所以基本上我想确保我在 x 卷中生成每个图块类型。我想 12 可能是 x 的一个很好的起点,但我希望能够调整 x。

如果有人能指出我正确的方向,将不胜感激。

更新

这是我目前的想法。感谢@Golo 以这种方式指点我。想法?

  1. 创建我想要的号码列表。
  2. 再添加 x 个随机数。
  3. 随机播放列表 -var shuffledList = unshuffledList.OrderBy(x => rand.Next()).ToList();
  4. 抓住第一项并从列表中删除。
  5. 列表为空时重新创建。

这应该意味着所有数字都会频繁出现,但您仍然可以重复出现,因此它会保持随机感觉。

创建一个包含您想要的数字的列表,然后从该列表中随机 select 一个元素并将其删除。

重复此操作直到您的列表为空,然后重新开始。

这样您将在 n 次尝试中获得每个数字一次,但它们的顺序是随机的。

我喜欢@Golo 的回答,但只是想在上面添加不同的内容。 . .

听起来他的回复只会给你每个值一次。 (即:在所有其他值都为 "rolled" 一次之前,您将不会再次看到值 n。)

要让事物真正随机,同时稍微更可预测,请尝试使用加权随机数生成器。

每次选择后,可以将选中项的权重置0(减少下一次被选中的几率,增加选中"oldest"个未选中值的几率。)

这些不在 .Net 中,但应该可以让您开始使用该算法。

http://www.perlmonks.org/?node_id=242744
http://peterkellyonline.blogspot.com/2012/02/weighted-random-selection-in-php.html