是否可以在2个双打之间生成一个随机数?
示例:
public double GetRandomeNumber(double minimum, double maximum)
{
return Random.NextDouble(minimum, maximum)
}
然后我用以下内容称呼它:
double result = GetRandomNumber(1.23, 5.34);
任何想法都会受到赞赏。
答案 0 :(得分:289)
是
Random.NextDouble返回介于0和1之间的双精度。然后将其乘以您需要进入的范围(最大值和最小值之间的差值),然后将其添加到基数(最小值)。
public double GetRandomNumber(double minimum, double maximum)
{
Random random = new Random();
return random.NextDouble() * (maximum - minimum) + minimum;
}
实际代码应该是随机的静态成员。这将节省创建随机数生成器的成本,并使您能够非常频繁地调用GetRandomNumber。由于我们在每次呼叫时初始化一个新的RNG,如果你打电话的速度足够快,系统时间不会在呼叫之间发生变化,RNG将获得完全相同的时间戳,并生成相同的随机数流。
答案 1 :(得分:37)
Johnny5建议创建一个扩展方法。这是一个更完整的代码示例,展示了如何执行此操作:
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);
请注意,您不应在循环中创建大量新的Random
对象,因为这可能会使您连续多次获得相同的值。如果您需要大量随机数,则创建一个Random
实例并重新使用它。
答案 2 :(得分:7)
最简单的方法是简单地生成0和两个数之差的随机数。然后将两个数字中较小的一个添加到结果中。
答案 3 :(得分:6)
注意:如果您在循环中生成random
,例如for(int i = 0; i < 10; i++)
,请不要将new Random()
声明放在循环中。
来自MSDN:
随机数生成从种子值开始。如果相同 种子被重复使用,生成相同的数字序列。一 产生不同序列的方法是制作种子价值 与时间有关,从而与每个新系列产生不同的系列 随机的实例。默认情况下,无参数构造函数 随机类使用系统时钟生成其种子值...
基于这个事实,做一些事情:
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));
}
这样做可以保证您获得不同的双倍值。
答案 4 :(得分:3)
你可以使用这样的代码:
public double getRandomNumber(double minimum, double maximum) {
return minimum + randomizer.nextDouble() * (maximum - minimum);
}
答案 5 :(得分:2)
你可以这样做:
public class RandomNumbers : Random
{
public RandomNumbers(int seed) : base(seed) { }
public double NextDouble(double minimum, double maximum)
{
return base.NextDouble() * (maximum - minimum) + minimum;
}
}
答案 6 :(得分:1)
如果其中一个值为负数怎么办?不是更好的主意:
double NextDouble(double min, double max)
{
if (min >= max)
throw new ArgumentOutOfRangeException();
return random.NextDouble() * (Math.Abs(max-min)) + min;
}
答案 7 :(得分:1)
如果您需要[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;
}
}
}
答案 8 :(得分:0)
关于生成相同的随机数,如果在循环中调用它,一个漂亮的解决方案是将循环外的新Random()对象声明为全局变量。
请注意,如果要在循环中运行它,则必须在GetRandomInt函数之外声明Random类的实例。
“这是为什么?”你问。
嗯,Random类实际上生成伪随机数,随机函数的“种子”是系统时间。如果您的循环足够快,系统时钟时间将不会与随机数发生器不同,并且Random类的每个新实例都将从相同的种子开始,并为您提供相同的伪随机数。
来源在这里:http://www.whypad.com/posts/csharp-get-a-random-number-between-x-and-y/412/
答案 9 :(得分:0)
使用静态随机数,或者由于系统时钟为它们提供种子,因此数字倾向于在紧密/快速循环中重复。
public static class RandomNumbers
{
private static Random random = new Random();
//=-------------------------------------------------------------------
// double between min and the max number
public static double RandomDouble(int min, int max)
{
return (random.NextDouble() * (max - min)) + min;
}
//=----------------------------------
// double between 0 and the max number
public static double RandomDouble(int max)
{
return (random.NextDouble() * max);
}
//=-------------------------------------------------------------------
// int between the min and the max number
public static int RandomInt(int min, int max)
{
return random.Next(min, max + 1);
}
//=----------------------------------
// int between 0 and the max number
public static int RandomInt(int max)
{
return random.Next(max + 1);
}
//=-------------------------------------------------------------------
}
另请参阅:https://docs.microsoft.com/en-us/dotnet/api/system.random?view=netframework-4.8
答案 10 :(得分:-1)
Random random = new Random();
double NextDouble(double minimum, double maximum)
{
return random.NextDouble()*random.Next(minimum,maximum);
}