2015-05-26 313 views
0

我使用生成我的游戏的随机数:伪随机数生成

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

的问题是,这些数字是太过随意。数字与瓦片有关,并且我没有获得20卷的特定瓦片。

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

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

更新

继承人什么,我想现在。感谢@Golo以这种方式指向我。思考?

  1. 创建我想要的号码列表。
  2. 添加更多的随机数。
  3. Shuffle list -var shuffledList = unshuffledList.OrderBy(x => rand.Next())。ToList();
  4. 抓住第一个项目并从列表中移除。
  5. 空白时重建列表。

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

+0

您正在寻找 “洗牌” 或 “加权随机数”(根据您的喜好)。 –

回答

4

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

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

这样,你会在n尝试让每个数字一次,但它们的顺序是随机的。

+0

不错。唯一的事情(如果我正确地理解OP)n(8)不同于x(12)。 – publicgk

+0

或者使用任何其他的随机码(选择和删除易于编码,但由于大量的复制操作,对于大型列表可能会有非常可疑的性能)。 –

+0

关闭,除非我再次看不到值n,直到所有其他值都被滚动。我不认为我会对此感到满意。 –

2

我喜欢@Golo的回答,只是为了增加一个不同的旋转。 。 。

这听起来像他的回应只会给你每个值一次。 (即:你不会看到值,直到所有其他值“滚动”一旦名词)

为了保持真正随机的,而稍微更加可预测,尝试加权随机数发生器。

每个选择之后,可以0出所选择的项目的(降低下一个被选择的它的机会,并增加选择“最老的”未被选择的值的机会。)的重量

这些不是在.Net中,但应该让你开始使用算法。

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