【问题标题】:random numbers only once in an array c# [duplicate]随机数在数组c#中只有一次[重复]
【发布时间】: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( ); (这个想法来自stackoverflow.com/a/34716618/1633949

标签: c# arrays random


【解决方案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 文档以获取更多信息和示例
【解决方案3】:

每次生成一个新数字时,不要立即将其放入数组中,而是检查从开始到当前位置的数组(使用 for 循环)。如果不存在插入生成的号码,否则生成一个新号码并重复该过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多