如何在C#中使用随机数?

6
我正在使用C#和XNA开发Pong游戏。
我想使用一个随机数(在一定范围内)来决定球是否直线反弹、以何种角度反弹以及球撞到球拍后移动的速度。
请告诉我如何实现。

10
球拍打到球的角度和速度不应该由球击中球拍的方式来决定吗?如果让它随机,似乎用户很难预测球会飞向哪里。 - Esteban Araya
1
@Esteban,如果是 Xtreme Pong,那就不一样了! - Grokodile
1
目前状态下,球的反弹取决于球拍在撞击时是否移动。但是如果两个球拍都没有移动,那么球就会直线运动没有任何变化。我想使用随机数来改变角度。 - Slateboard
6个回答

15

使用Random类。例如:

Random r = new Random();
int nextValue = r.Next(0, 100); // Returns a random number from 0-99

4
值得注意的是,您应该只创建一个Random实例(每个线程)。对于简单的单线程游戏,将其作为派生Game类的public static readonly成员通常是我的做法。另请参阅Jon Skeet的答案:https://dev59.com/y07Sa4cB1Zd3GeqP8Pm3#3218084 - Andrew Russell

8
除非您需要加密安全的数字,否则Random对您来说应该是可以的...但是有两个需要注意的问题:
  • 您不应每次需要时都创建一个新实例。如果您创建一个没有指定种子的实例,则会使用当前时间作为种子 - 这意味着如果您快速连续创建多个实例,则其中许多实例将产生相同的数字序列。通常,您创建一个长期存在的Random实例并重复使用它。
  • 它不是线程安全的。如果您需要从多个线程生成随机数,则应考虑每个线程拥有一个实例。阅读此博客文章以获取更多信息 - 但请确保您也阅读评论,因为它们提供了非常有用的信息。

+1。非常好的技巧;我一次又一次地看到人们被咬伤。我最喜欢的错误是在紧密循环内实例化Random并使用“DateTime.Now”种子来修复问题的希望。 :) - Esteban Araya

1
Random rnd = new Random();
rnd.Next(minValue, maxValue);

rnd.Next(1,10);

1
使用 Random 对象的 Next 方法,该方法接受最小值和最大值,并返回该范围内的值:
var random = new Random();    
int randomNum = random.Next(min, max);

1

虽然您可以像其他人建议的那样使用Random类,但是Random类仅使用伪随机数生成。在System.Security.Cryptography命名空间中可以找到RandomNumberGenerator,它创建实际的随机数。

如何使用:

RandomNumberGenerator rng = RandomNumberGenerator.Create();
byte[] rand = new byte[25]; //Set the length of this array to
                           // the number of random numbers you want
rng.GetBytes(rand);

更多信息:http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator(v=VS.80).aspx

RandomNumberGenerator是一个抽象类。使用从该类派生的RNGCryptoServiceProvider。尽管如此,它仍然产生“密码强度”的随机数,这仍然是伪随机的。根据https://dev59.com/m3RC5IYBdhLWcg3wD87r,RNGCryptoServiceProvider对于此问题来说速度较慢且过于复杂。 - Ranhiru Jude Cooray
这种方法会更随机,但可能会影响性能,因此需要适当平衡。您可能不需要这么多的随机性,而且使用起来也可能没有Random那么容易。 - TJB
我想我只是提供它作为一个选项。老实说,我可能也会使用随机数生成器。 - Adam P
1
RandomNumberGenerator不会生成“真正”的随机数;它仍然是一个伪随机数生成器。如果您只需要随机性,那么由Random生成的数字就可以了。而密码学伪随机数生成器只会生成更难以预测的数字。 - Will Vousden

0

这是我的随机数生成器

 private static Random rnd = new Random(Environment.TickCount);

 private int RandomNum(int Lower, int Upper)
{

 return rnd.Next(Lower, Upper);//MyRandomNumber;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接