从范围中选择但不包括某些数字

RSM*_*RSM 10 c# random wpf numbers range

是否可以从给定范围(1-90)中选择一个随机数,但不包括某些数字.排除的数字是动态创建的,但可以说它们分别为3,8和80.

我已设法创建随机数生成器,但无法识别任何让我满足我的要求的功能.

Random r = new Random();
this.num = r.Next(1, 90);
Run Code Online (Sandbox Code Playgroud)

要排除的数字是先前生成的数字.因此,如果随机数为1,则会将其添加到排除的数字列表中.

Dav*_*vid 8

在这里使用一些方便的扩展方法,您可以创建一系列数字并从该愤怒中随机选择.例如,使用这些扩展方法:

public static T RandomElement(this IEnumerable<T> enumerable)
{
    return enumerable.RandomElementUsing(new Random());
}

public static T RandomElementUsing(this IEnumerable<T> enumerable, Random rand)
{
    int index = rand.Next(0, enumerable.Count());
    return enumerable.ElementAt(index);
}
Run Code Online (Sandbox Code Playgroud)

您可以将这些应用于过滤的数字范围:

var random = Enumerable.Range(1, 90).Except(arrayOfRemovedNumbers).RandomElement();
Run Code Online (Sandbox Code Playgroud)

  • 我认为使用带有非直接IList源的`ElementAt`并不是很有效. (2认同)
  • @KingKing:性能绝对是OP想要测试的内容,同意.对于这种情况下的整数列表,我无法想象这是一个大问题.当然比建议在循环中选择一个新的随机数的答案要好:) (2认同)

gle*_*eng 5

创建一个容纳您不想要的数字的容器:

var excludedNumbers = new List<int> { 1, 15, 35, 89 };
Run Code Online (Sandbox Code Playgroud)

然后使用类似的东西:

Random random = new Random();

int number;

do
{
   number = r.Next(1, 90);
} while (excludedNumbers.Contains(number));

// number is not in the excluded list now
Run Code Online (Sandbox Code Playgroud)