【问题标题】:pseudo random number generation伪随机数生成
【发布时间】:2015-08-07 14:37:30
【问题描述】:

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

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

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

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

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

更新

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

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

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

【问题讨论】:

  • 您正在寻找“随机播放”或“加权随机数”(取决于您的偏好)。

标签: c# random numbers


【解决方案1】:

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

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

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

【讨论】:

  • 不错。唯一(如果我正确理解 OP)n (8) 与 x (12) 不同。
  • 或者使用任何其他的随机播放代码(选择和删除很容易编码,但由于大量的复制操作,对于大型列表的性能可能会非常有问题)。
  • 接近,除非我不会再看到值 n,直到所有其他值都被滚动。我不认为我会对此感到满意。
【解决方案2】:

我喜欢@Golo 的回答,但只是为了在上面添加不同的旋转。 . .

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

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

每次选择后,您可以将所选项目的权重设为 0(减少下一次选择它的机会,并增加选择“最旧”未选择值的机会。)

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

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

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 2012-02-12
    • 1970-01-01
    • 2018-03-20
    • 2012-02-09
    • 2014-10-30
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多