从2个不同的范围生成随机数

时间:2015-11-12 21:08:36

标签: c# random

如何从两个不同的范围生成随机数?

例如:10-20和50-60之间的一个数字。

我知道如何从一个范围(1-13)生成一个随机数:

Random rnd = new Random();
int num = rnd.Next(1, 13);

5 个答案:

答案 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,在其中添加NextFromRangesNextDoubleFromRanges方法。因此,它将适用于任何类型的给定数量的范围。
首先,您需要定义一个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

就像NextNextDouble方法一样,上限是互斥的

您现在将向标准Random类添加两个额外的方法: enter image description here

答案 4 :(得分:-2)

您可以编写自己的Random类。使用可接受偶数个参数的新重载重写Next方法的地方。

看起来像是:

Random.NextFromGroups(10, 20, 50, 60, 100, 110);

数字对意味着范围。

签名:

int NextFromGroups(params int[]);

当它获得奇数个参数时会抛出异常。