通过排除数字动态调整随机生成器范围

本文关键字:范围 随机 调整 排除 数字 动态 | 更新日期: 2023-09-27 18:17:54

我想知道是否有可能执行以下情况:

使用随机对象生成指定范围内的数字,例如:

Random generator = new Random(0, 100);

如果我输入generator.next(),我将得到数字40(例如)。现在,当我再次输入generator.next()时,我想在(0 - 39, 41 - 100)范围内得到一个新的随机数。因此,我想从生成器的范围中消除生成的数字。

这可能吗?

通过排除数字动态调整随机生成器范围

这将创建count在0 - 100范围内的唯一随机数

public IEnumerable<int> Randomize(int count, int seed)
{
    var generator = new Random(seed);
    return Enumerable.Range(0, 100)
      .Select(x => new { Value = x, SortOrder = generator.Next() })
      .OrderBy(x => x.SortOrder)
      .Select(x => x.Value)
      .Take(count);
}

你甚至不需要Random object:

var uniqueRandomNums = Enumerable.Range(0, 100)
                       .OrderBy(n => Guid.NewGuid())
                       .Take(num)
                       .ToList();

这样的类可以很好地完成:

using System;
using System.Collections.Generic;
namespace RandomTools
{
    public class NonRepeatingRandom
    {
        private Random _random;
        private List<int> _possibleValues;
        public NonRepeatingRandom(int minValue, int maxValue)
        {
            _random = new Random();
            _possibleValues = new List<int>();
            for (var i = minValue; i < maxValue; i++)
            {
                _possibleValues.Add(i);
            }
        }
        public int Next()
        {
            var possibleValuesCount = _possibleValues.Count;
            if (possibleValuesCount == 0)
            {
                return -1;
            }
            var nextIndex = _random.Next(0, possibleValuesCount);
            var nextValue = _possibleValues[nextIndex];
            _possibleValues.RemoveAt(nextIndex);
            return nextValue;
        }
    }
}

你可以简单地这样使用:

using RandomTools;

var myRandom = new NonRepeatingRandom(0, 100);
var nextValue = myRandom.Next();

当您用尽所有可能的值时,它将返回-1。

下面代码中的想法(不保证编译…这是我的想法),就是制作一个可用数字的列表,然后从列表中随机选择,当它们被选中时删除它们。这避免了产生过多的随机数。你只需要生成99个随机数。当你只剩下一个数字时,你只需在最后加上那一个。

var countWanted = 100;
var dest = new List<int>(countWanted);
var source = new List<int>();
for (int i = 0; i < 100 ; i++) source.Add(i);
var r = new Random();
for (int i = 100; i > 100-countWanted; i--)
    var n = r.Next(0,i);
    dest.Add(source[n]);
    source[n] = source[i-1];
}

创建一个整数列表

var myList = new List<int>();
var myrandom = new Random();

当你需要一个随机的,这样做:

int newRandom;
while(true){
    newRandom = myrandom.Next(0,100);
    if (!myList.Contains(newRandom)){
        myList.Add(newRandom);
        break;
    }
}
//continue execution here
System.Diagnostics.Debug.Print(newRandom);