【发布时间】:2011-04-27 21:06:27
【问题描述】:
如何在一个范围内产生随机数?
【问题讨论】:
如何在一个范围内产生随机数?
【问题讨论】:
你可以试试
Random r = new Random();
int rInt = r.Next(0, 100); //for ints
int range = 100;
double rDouble = r.NextDouble()* range; //for doubles
看看
Random Class、Random.Next Method (Int32, Int32) 和 Random.NextDouble Method
【讨论】:
double rDouble = (r.NextDouble()*2)-1.0;
Random() 使用与时间相关的种子,但明确地写出它更便于阅读。
试试下面的代码。
Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7); // creates a number between 1 and 6
int card = rnd.Next(52); // creates a number between 0 and 51
【讨论】:
类似:
var rnd = new Random(DateTime.Now.Millisecond);
int ticks = rnd.Next(0, 3000);
【讨论】:
DateTime.Now.Millisecond 是什么?
Random 已经植入了系统值,而Millisecond 只是一个介于 0 和 999 之间的数字。如果这对行在代码中始终在一起,则可能只有 1000 个值的rnd.Next,因为每次都会重置种子。输入相同的种子,输出相同的随机数。我会把手动种子放在外面。
Environment.TickCount初始化的。
用途:
Random r = new Random();
int x= r.Next(10);//Max range
【讨论】:
对于未来的读者,如果您想要一个范围内的随机数,请使用以下代码:
public double GetRandomNumberInRange(double minNumber, double maxNumber)
{
return new Random().NextDouble() * (maxNumber - minNumber) + minNumber;
}
【讨论】:
return new Random().NextDouble() * (maxNumber - minNumber) + minNumber;
这里是Darrelk answer 的更新版本。 它是使用C# extension methods 实现的。 每次调用此方法时,它都不分配内存(new Random())。
public static class RandomExtensionMethods
{
public static double NextDoubleRange(this System.Random random, double minNumber, double maxNumber)
{
return random.NextDouble() * (maxNumber - minNumber) + minNumber;
}
}
用法(确保导入包含 RandomExtensionMethods 类的命名空间):
var random = new System.Random();
double rx = random.NextDoubleRange(0.0, 1.0);
double ry = random.NextDoubleRange(0.0f, 1.0f);
double vx = random.NextDoubleRange(-0.005f, 0.005f);
double vy = random.NextDoubleRange(-0.005f, 0.005f);
【讨论】:
除了生成整数和双精度数的Random Class 之外,请考虑:
【讨论】: