C# 如何生成9个唯一的随机数
我想生成9个随机数,但我不想生成同一个数两次。有没有一个简单的方法可以做到这一点C# 如何生成9个唯一的随机数,c#,random,C#,Random,我想生成9个随机数,但我不想生成同一个数两次。有没有一个简单的方法可以做到这一点 我想创建0到10之间的数字,得到数字1,2,3,4,5,6,7,8,9。我将把这些数字放在一个数组中,如果我两次得到相同的数字,代码将不起作用,而且每次启动程序时,它们都必须是随机的、不同的数字。只需不断生成新的数字,并将它们与以前生成的数字进行比较。使用 我发现这是一个比检查旧数字更干净的解决方案,理论上可能永远循环; using System; using System.Linq; namespace Tes
我想创建0到10之间的数字,得到数字1,2,3,4,5,6,7,8,9。我将把这些数字放在一个数组中,如果我两次得到相同的数字,代码将不起作用,而且每次启动程序时,它们都必须是随机的、不同的数字。只需不断生成新的数字,并将它们与以前生成的数字进行比较。使用 我发现这是一个比检查旧数字更干净的解决方案,理论上可能永远循环;
using System;
using System.Linq;
namespace Test {
class Program {
static void Main(string[] args) {
var random = new Random();
int[] sequence = new int[9];
do {
for (var i = 0; i < sequence.Length; i++) {
sequence[i] = random.Next();
}
} while (sequence.Distinct().Count() != sequence.Length);
}
}
}
使用System.Linq;
名称空间测试{
班级计划{
静态void Main(字符串[]参数){
var random=新的random();
int[]序列=新的int[9];
做{
对于(var i=0;i- 而我只有不到N个项目
- 生成项目
- 如果是重复的,就丢弃它
- 列举整个范围
- 将枚举无序排列为随机顺序
- 以前N项为例
Random _random = new Random();
public static void Shuffle<T>(T[] array)
{
var random = _random;
for (int i = array.Length; i > 1; i--)
{
// Pick random element to swap.
int j = random.Next(i); // 0 <= j <= i-1
// Swap.
T tmp = array[j];
array[j] = array[i - 1];
array[i - 1] = tmp;
}
}
此方法将原始数组洗牌到位,但它可以轻松修改,以便返回不同的对象。不需要对“以前的值”进行比较。在您的例子中,它只需迭代8次。Random r=new Random();
int[] numbers = (
from number in Enumerable.Range(0, 10)
orderby Guid.NewGuid()
select number)
.ToArray();
列表编号=新列表{1,2,3,4,5,6,7,8,9};
列表结果=新列表();
while(numbers.Count()>0)
{
int pos=r.Next(0,numbers.Count()-1);
结果。添加(编号[pos]);
号码。删除(pos);
}
对10个数字使用循环,并使用int r=arc4random()%数字;其中number是number生成、存储和使用这些编号的范围。我希望它能帮助您更好地了解您的需求。这将生成6个介于0和10之间的随机整数(不包括):
你们有射程吗?最小接受值是多少?或者是最大的一个?我想利用时间戳来进行这类检查。检查之前生成的数字有什么困难,以至于您正在寻找一种“简单的方法”?重复的链接是一篇非常好的文章。我再怎么强调解决方案“不断生成并搜索碰撞”有多糟糕也不为过,这是一次采访“nohire”。为了解决这个问题,我自己提出了洗牌算法,后来才发现它已经发明出来,并命名为Fisher-Yates洗牌。
int[] numbers = (
from number in Enumerable.Range(0, 10)
orderby Guid.NewGuid()
select number)
.ToArray();
Random r = new Random();
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> result = new List<int>();
while (numbers.Count() > 0)
{
int pos = r.Next(0, numbers.Count() - 1);
result.Add(numbers[pos]);
numbers.RemoveAt(pos);
}
int[] numbers = Enumerable.Range(0, 10)
.OrderBy(i => Guid.NewGuid())
.Take(6)
.ToArray();