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

问题描述 投票:2回答:5

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

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

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

Random rnd = new Random();
int num = rnd.Next(1, 13);
c# random
5个回答
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();

2
投票

请记住,对于Next方法,下限是包含的,而上限是独占的。怎么样:

var rand = new Random();
var num1 = rand.Next(10, 21);

var num2 = rand.Next(50, 61);

var myNum = rand.Next(0, 2) == 1 ? num1 : num2;

2
投票

您将生成22个不同的随机数,10-20和50-60。首先这样做:

int randomNumber = rnd.Next(0, 22);

现在,您有0到21之间的随机数。

加10:

randomNumber += 10;

现在,您有10到31之间的随机数。

为所有数字> = 21添加29:

if (randomNumber >= 21) {
    randomNumber += 29;
}

现在,您有10到20之间的随机数,以及50到60之间的随机数。


2
投票

更通用的方法是为Extension Method类制作Random,其中添加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范围之一之间的随机int数:0-10,50-60和100-110。 - 三个给定的double范围之一之间的随机double数:0-5.5,50-55.5,100-105.5

就像qazxsw poi和qazxsw poi方法一样,上限是独占的。

现在,您将在标准Next类中添加两个额外的方法:NextDouble


-2
投票

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

它看起来像:

Random

数字对表示范围。

签名:

enter image description here

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

© www.soinside.com 2019 - 2024. All rights reserved.