如何从两个不同的范围生成随机数?
例如:10-20和50-60之间的一个数字。
我知道如何从一个范围(1-13)生成一个随机数:
Random rnd = new Random();
int num = rnd.Next(1, 13);
答案 0 :(得分:6)
int num = rnd.Next(1, 3)==1 ? rnd.Next(10, 21) : rnd.Next(50,61);
或
int num = rnd.Next(10, 32);
if (num>20) num+=29;
或只是为了好玩(不要使用大范围,无论如何都要慢跑):
var ranges=new []{ Tuple.Create(10,20), Tuple.Create(50,60)};
var rnd=new Random();
var possible=ranges.Select(x=>Enumerable.Range(x.Item1,x.Item2-x.Item1+1))
.SelectMany(x=>x)
.Distinct();
var num=possible.Skip(rnd.Next(0,possible.Count())).First();
答案 1 :(得分:2)
请记住,对于Next方法,下限是包含的,而上限是独占的。怎么样:
{{1}}
答案 2 :(得分:2)
您正在生成22个不同的随机数,10-20和50-60。所以先做到这一点:
int randomNumber = rnd.Next(0, 22);
现在,您有0到21之间的随机数。
加10:
randomNumber += 10;
现在,您的随机数介于10到31之间。
为所有数字添加29> = 21:
if (randomNumber >= 21) {
randomNumber += 29;
}
现在,你有从10到20,从50到60的随机数。
答案 3 :(得分:2)
更通用的方法是为Random
类创建一个Extension Method,在其中添加NextFromRanges
和NextDoubleFromRanges
方法。因此,它将适用于任何类型的给定数量的范围。
首先,您需要定义一个Range
类。使其为generic,以便您可以将其重用于不同的类型,不仅用于int
范围,而且还可以用于double
。
/// <summary>The Range class.</summary>
/// <typeparam name="T">Generic parameter.</typeparam>
public class Range<T>
{
/// <summary>Minimum value of the range.</summary>
public T Minimum { get; set; }
/// <summary>Maximum value of the range.</summary>
public T Maximum { get; set; }
public Range(T min, T max)
{
Minimum = min;
Maximum = max;
}
}
public static class RandomExtension
{
static Random random = new Random();
public static int NextFromRanges(this Random random, List<Range<int>> ranges)
{
int randomRange = random.Next(0, ranges.Count);
return random.Next(ranges[randomRange].Minimum, ranges[randomRange].Maximum);
}
public static double NextDoubleFromRanges(this Random random, List<Range<double>> ranges)
{
int randomRange = random.Next(0, ranges.Count);
double doubleNrRange = ranges[randomRange].Maximum - ranges[randomRange].Minimum;
return ranges[randomRange].Minimum + random.NextDouble()*doubleNrRange;
}
}
然后您可以像这样使用它:
//instantiate a Random generator
Random random = new Random();
//define three integer ranges
List<Range<int>> intRanges = new List<Range<int>>();
intRanges.Add(new Range<int>(0, 10));
intRanges.Add(new Range<int>(50, 60));
intRanges.Add(new Range<int>(100, 110));
//define three double ranges
List<Range<double>> doubleRanges = new List<Range<double>>();
doubleRanges.Add(new Range<double>(0, 5.5));
doubleRanges.Add(new Range<double>(50, 55.5));
doubleRanges.Add(new Range<double>(100, 105.5));
//generate a random number between one of above three ranges
//it is shown in the Visual Studio - Output window (Ctrl-W,O)
Console.WriteLine(random.NextFromRanges(intRanges));
Console.WriteLine(random.NextDoubleFromRanges(doubleRanges));
它将产生:
-给定int
的三个值之一之间的-random int
数字:0-10、50-60和100-110。
-给定double
的三个值之一之间的-random double
数字:0-5.5、50-55.5、100-105.5
就像Next和NextDouble方法一样,上限是互斥的。
您现在将向标准Random类添加两个额外的方法:
答案 4 :(得分:-2)
您可以编写自己的Random类。使用可接受偶数个参数的新重载重写Next方法的地方。
看起来像是:
Random.NextFromGroups(10, 20, 50, 60, 100, 110);
数字对意味着范围。
签名:
int NextFromGroups(params int[]);
当它获得奇数个参数时会抛出异常。