通过排除数字动态调整随机生成器范围
本文关键字:范围 随机 调整 排除 数字 动态 | 更新日期: 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);