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; } } }