我知道C#中的random()函数使用处理器的时钟来返回它的值,很快我不得不做一些技巧让它在短时间内返回不同的值。现在出现了新的东西:我可以返回多个不同的值,但它不是“随机”。
我可以用这张照片解释一下。我让这段代码运行几秒钟......
spawnMsCounter += gt.ElapsedGameTime.Milliseconds;
if (spawnMsCounter > 1)
{
spawnMsCounter -= 1;
random = new Random();
float x = random.Next(-1, game.Window.ClientBounds.Width);
int y = random.Next(-1,random.Next(1,game.Window.ClientBounds.Height));
Coins.Add(new Coin(coinTexture,x,y));
}
我得到了这个: http://img62.imageshack.us/img62/4783/khrogbeta20110916154637.png
如您所见,大多数点在屏幕的顶部产生;为什么?以及如何解决 - 或者创建更好的代码 -
答案 0 :(得分:5)
每次都不要创建新的Random对象。将它作为私有静态或类中使用它的东西。
答案 1 :(得分:2)
你应该重复使用随机对象,但我认为硬币倾向于向顶部产生的原因是这行代码:
int y = random.Next(-1,random.Next(1,game.Window.ClientBounds.Height));
您首先生成一个介于1和客户端高度之间的随机数,然后将其用作生成另一个随机数的边界,该随机数介于-1和生成的第一个值之间。由于第二个值总是小于或等于生成的第一个值,因此较低的值比较高的值更可能(事实上,您的图片大致显示了人们期望的分布)。要获得统一分布,您需要:
int y = random.Next(-1,game.Window.ClientBounds.Height);