随机数在数组c#中只有一次[重复]
Posted
技术标签:
【中文标题】随机数在数组c#中只有一次[重复]【英文标题】:random numbers only once in an array c# [duplicate] 【发布时间】:2019-07-15 11:31:43 【问题描述】:我想生成随机数并将它们放入一个数组中,但它们应该只在这个数组中出现一次。这就像一个迷你乐透游戏。 这是我现在拥有的代码:
int[] arrA = new int[10];
Random random = new Random();
for (int i = 0; i <= arrA.Length -1; i++)
arrA[i] = random.Next(1, 15);
Console.WriteLine(arrA[i]);
Console.ReadKey();
生成随机数并将其放入此数组中。我只需要知道如何编程让它们只出现一次。
【问题讨论】:
当你选择一个随机数时,检查它是否已经在数组中。如果是,请选择另一个。 但是我该怎么做呢?.Contains(...)
?
只要求一个数字并不是随机,尤其是在范围很小的时候。当您放置唯一性约束时,您最终会得到更多可预测的数字
一个做你想做的单线是: var arrA = Enumerable.Range(1,14).OrderBy(g => random.Next()).Take(10).ToArray( ); (这个想法来自***.com/a/34716618/1633949)
【参考方案1】:
使用HashSet<T>
。集合是不包含重复元素且其元素没有特定顺序的集合。
类似这样的:
using System;
using System.Collections.Generic;
HashSet<int> numbers = new HashSet<int>();
for (int i = 0; i < 10; i++)
// Start with a random number
//
int value = random.Next(1,15);
// Check whether you already have that number
// Keep trying until you get a unique
//
while (numbers.Contains(value))
value = random.Next(1,15);
// Add the unique number to the set
numbers.Add(value);
foreach (int i in numbers)
Console.Write(" 0", i);
【讨论】:
你可以添加一个while循环来确保numbers
总是有10个唯一的随机值。
如果生成的数字已经存在,则哈希集将不包含这 10 个元素。计数 = 10 - 重复的数字
啊,好的,谢谢。我一发帖就这么想。编辑添加检查。
您可以使用来自Add 的返回值来简化您的代码。类似for (var i=0;i<10;++i) while (!numbers.Add(random.Next(1, 15)));
【参考方案2】:
int[] arrA = new int[10];
Random random = new Random();
for (int i = 0; i <= arrA.Length - 1; i++)
var number = random.Next(1, 15);
while (arrA.Any(n => n == number))
number = random.Next(1, 15);
arrA[i] = number;
Console.WriteLine(arrA[i]);
Console.ReadKey();
【讨论】:
非常感谢!但是你能向我解释一下这个“while”是如何工作的吗? while (arrA.Any(n => n == number)) 表示如果生成的随机数存在于数组中,则生成另一个以此类推,它的循环只有在随机数组中不存在数字。查看 Microsoft 文档以获取更多信息和示例 文档:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…【参考方案3】:每次生成一个新数字时,不要立即将其放入数组中,而是检查从开始到当前位置的数组(使用 for 循环)。如果不存在插入生成的号码,否则生成一个新号码并重复该过程。
【讨论】:
以上是关于随机数在数组c#中只有一次[重复]的主要内容,如果未能解决你的问题,请参考以下文章