2个双数之间的随机数

有可能在2个双打之间产生一个随机数字?

例:

public double GetRandomeNumber(double minimum, double maximum) { return Random.NextDouble(minimum, maximum) } 

然后我用以下方法来调用它:

 double result = GetRandomNumber(1.23, 5.34); 

任何想法将不胜感激。

是。

Random.NextDouble返回一个介于0和1之间的双精度值。然后将其乘以所需的范围(最大值和最小值之间的差值),然后将其加到基值(最小值)。

 public double GetRandomNumber(double minimum, double maximum) { Random random = new Random(); return random.NextDouble() * (maximum - minimum) + minimum; } 

真正的代码应该是随机的静态成员。 这将节省创build随机数生成器的成本,并使您能够非常频繁地调用GetRandomNumber。 由于我们在每次呼叫时都初始化一个新的RNG,所以如果调用足够快,系统时间不会在两次呼叫之间改变,那么RNG将得到完全相同的时间戳,并生成相同的随机数字stream。

Johnny5build议创build一个扩展方法。 下面是一个更完整的代码示例,展示如何做到这一点:

 public static class RandomExtensions { public static double NextDouble( this Random random, double minValue, double maxValue) { return random.NextDouble() * (maxValue - minValue) + minValue; } } 

现在你可以把它叫做Random类的一个方法:

 Random random = new Random(); double value = random.NextDouble(1.23, 5.34); 

请注意,您不应该在循环中创build大量新的Random对象,因为这可能会使您连续多次获得相同的值。 如果你需要大量的随机数然后创build一个Random实例并重新使用它。

最简单的方法就是简单地生成一个介于0和两个数字之间的随机数。 然后将两个数字中较小的一个添加到结果中。

注意:如果你在循环内生成random ,例如for(int i = 0; i < 10; i++) ,不要把new Random()声明放在循环中。

来自MSDN :

随机数生成从种子值开始。 如果重复使用相同的种子,则生成相同的一系列数字。 产生不同序列的一种方法是使种子值具有时间依赖性,从而与每个新的Random实例产生不同的序列。 默认情况下,Random类的无参数构造函数使用系统时钟来生成其种子值…

所以基于这个事实,做一些事情:

 var random = new Random(); for(int d = 0; d < 7; d++) { // Actual BOE boes.Add(new LogBOEViewModel() { LogDate = criteriaDate, BOEActual = GetRandomDouble(random, 100, 1000), BOEForecast = GetRandomDouble(random, 100, 1000) }); } double GetRandomDouble(Random random, double min, double max) { return min + (random.NextDouble() * (max - min)); } 

这样做你有保证你会得到不同的双重价值。

你可以使用这样的代码:

 public double getRandomNumber(double minimum, double maximum) { return minimum + randomizer.nextDouble() * (maximum - minimum); } 

你可以这样做:

 public class RandomNumbers : Random { public RandomNumbers(int seed) : base(seed) { } public double NextDouble(double minimum, double maximum) { return base.NextDouble() * (maximum - minimum) + minimum; } } 

如果其中一个值是负值呢? 会不会有更好的主意:

 double NextDouble(double min, double max) { if (min >= max) throw new ArgumentOutOfRangeException(); return random.NextDouble() * (Math.Abs(max-min)) + min; } 

关于如果在循环中调用它,生成相同的随机数一个漂亮的解决scheme是将新的Random()对象作为全局variables声明在循环之外。

注意你必须在GetRandomInt函数之外声明你的Random类的实例,如果你要在循环中运行它。

“为什么?”你问。

那么,随机类实际上会产生伪随机数,随机数的“种子”是系统时间。 如果你的循环速度足够快,那么系统时钟的时间就不会像随机数发生器那样出现,每个Random类的新实例都会以相同的种子开始,并给出相同的伪随机数。

来源是在这里: http : //www.whypad.com/posts/csharp-get-a-random-number-between-x-and-y/412/

 Random random = new Random(); double NextDouble(double minimum, double maximum) { return random.NextDouble()*random.Next(minimum,maximum); } 

如果您需要一个在[ double.MinValue ; double.MaxValue ]

 // Because of: double.MaxValue - double.MinValue == double.PositiveInfinity // This will be equals to NaN or PositiveInfinity random.NextDouble() * (double.MaxValue - double.MinValue) 

改用:

 public static class RandomExtensions { public static double NextDoubleInMinMaxRange(this Random random) { var bytes = new byte[sizeof(double)]; var value = default(double); while (true) { random.NextBytes(bytes); value = BitConverter.ToDouble(bytes, 0); if (!double.IsNaN(value) && !double.IsInfinity(value)) return value; } } }