我想知道是否有可能执行以下情况:
我使用Random对象生成指定范围内的数字,例如:
Random generator = new Random(0, 100);
如果我输入generator.next()
,我会得到号码40
(例如)。现在,当我再次输入generator.next()
时,我希望获得一个新的随机数,范围为(0 - 39, 41 - 100)
。所以我想从生成器的范围中消除生成的数字。
这可能吗?
答案 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);