如何生成不重复的唯一随机整数

本文关键字:唯一 随机 整数 何生成 | 更新日期: 2023-09-27 18:17:31

我创建了一个简短的程序,它创建了1-9之间的3个随机整数,并将它们存储在一个数组中,但是,我不希望它们中的任何一个重复,也就是说,我希望每个都是唯一的。有没有一种更简单的方法来生成3个唯一的整数,而不是必须遍历数组并将每个整数相互比较?如果我要把数组增加到超过3个整数,这看起来很乏味。这是我生成3个随机数的代码。我看到其他Java代码,但我想c#可能有更简单、更有效的方法。

var number = new Numbers[3];
Random r = new Random();
for ( int i = 0; i < number.Length; i++)
{
     number[i] = new Numbers(r.Next(1,9));
}
Console.WriteLine("The Three Random Numbers Are:");
foreach(Numbers num in number)
{
    Console.WriteLine("{0}", num.Number);
}

如何生成不重复的唯一随机整数

我会这样做:

var range = Enumerable.Range(1, 8);
var rnd = new Random();
var listInts = range.OrderBy(i => rnd.Next()).Take(3).ToList();

您可以将可能生成的数字制作成数组或列表,例如0,1,2,3。然后你生成一个从0到这个列表长度的数字,例如2,然后选择list[2],这样下次你的列表中就只有0,1,3了。生成它需要更长的时间,特别是对于长列表,但它不重复数字。

using System;
using System.Collections.Generic;
public class Test
{
    static Random random = new Random();
    public static List<int> GenerateRandom(int count)
    {
        // generate count random values.
        HashSet<int> candidates = new HashSet<int>();
        // top will overflow to Int32.MinValue at the end of the loop
        for (Int32 top = Int32.MaxValue - count + 1; top > 0; top++)
        {
            // May strike a duplicate.
            if (!candidates.Add(random.Next(top))) {
                candidates.Add(top);
            }
        }
        // load them in to a list.
        List<int> result = new List<int>();
        result.AddRange(candidates);
        // shuffle the results:
        int i = result.Count;  
        while (i > 1)
        {  
            i--;  
            int k = random.Next(i + 1);  
            int value = result[k];  
            result[k] = result[i];  
            result[i] = value;  
        }  
        return result;
    }
    public static void Main()
    {
        List<int> vals = GenerateRandom(10);
        Console.WriteLine("Result: " + vals.Count);
        vals.ForEach(Console.WriteLine);
    }
}

从这里收集解释和答案

源http://ideone.com/Zjpzdh