通过排除数字动态调整随机发电机范围?

时间:2015-10-14 18:40:35

标签: c# random

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

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

Random generator = new Random(0, 100);

如果我输入generator.next(),我会得到号码40(例如)。现在,当我再次输入generator.next()时,我希望获得一个新的随机数,范围为(0 - 39, 41 - 100)。所以我想从生成器的范围中消除生成的数字。

这可能吗?

5 个答案:

答案 0 :(得分:1)

这将创建 count 唯一随机数,范围为0 - 100

ArrayList

答案 1 :(得分:0)

下面的代码中的想法(不保证编译......它不在我的脑海中),是列出可用的数字,然后从该列表中随机选择,在它们被选中时删除它们。这避免了过多的随机数生成。您只需要生成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];
}

答案 2 :(得分:0)

你甚至不需要Random对象:

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

答案 3 :(得分:0)

这样的课程可以很好地完成:

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。

答案 4 :(得分:-2)

制作整数列表

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);