随机数在数组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&lt;T&gt;。集合是不包含重复元素且其元素没有特定顺序的集合。

类似这样的:

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&lt;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#中只有一次[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何生成保存到数组中的随机字符串? c# [重复]

2d 数组随机数(10 行,6 列)不重复到文件 C#

如何让C#产生不重复的随机数

如何在 C# 数组字符串中选择 5 位随机数? [复制]

C#中如何从数组中获取一个随机数

在按钮 Click (C#) 上创建一个带有随机数的数组