生成一些唯一的数字并放入数组

时间:2012-08-16 09:01:08

标签: c#

我正在尝试创建一个产生10个唯一随机数的方法,但这些数字并不是唯一的,我得到了几个重复数!如何根据需要改进代码?

        int[] randomNumbers = new int[10];

        Random random = new Random();

        int index = 0;

        do
        {
            int randomNum = random.Next(0, 10);
            if (index == 0)
            {
                randomNumbers[0] = randomNum;
                index++;
            }

            else
            {
                for (int i = 0; i < randomNumbers.Length; i++)
                {
                    if (randomNumbers[i] == randomNum)
                        break;
                    else
                    {
                        randomNumbers[index] = randomNum;
                        index++;
                        break;
                    }
                }
            }
        }
        while (index <= 9);

foreach (int num in randomNumbers)
            System.Console.Write(num + " ");

编辑2:我现在已经纠正了所有错误,但是这段代码不起作用,因为数字不是唯一的!我已将上面的代码更新到最新版本。我提前帮助解决这个问题!谢谢!

3 个答案:

答案 0 :(得分:7)

最简单的方法是拥有一个你想要的数字数组(即1-10)并使用随机混洗算法。

Fisher-Yates shuffle是最简单的方法。

编辑:

以下是C#实施的链接:http://www.dotnetperls.com/fisher-yates-shuffle

答案 1 :(得分:2)

random.next(0,10)返回一个0到10之间的随机数。可能会发生,它连续多次返回相同的数字并且无法保证,你得到0到10之间的每个数字恰好一次,当你打电话10次。

你想要的是一个数字列表,每个数字都是唯一的,介于0和9(或1和10)之间。对此的可能解决方案是这样的:

//Create the list of numbers you want
var list = new List<int>();
for(var x = 0; x < 10; x++)
{
    list.Add(x);
}

var random = new Random();
//Prepare randomized list
var randomizedList = new List<int>();
while(list.Length > 0)
{
    //Pick random index in the range of the ordered list
    var index = random.Next(0, list.Length);

    //Put the number from the random index in the randomized list
    randomizedList.Add(list[index]);

    //Remove the number from the original list
    list.RemoveAt(index);
}

用文字解释,这就是你所做的:

  1. 创建包含所有数字的列表,最终列表应包含
  2. 创建第二个空列表。
  3. 输入循环。只要有序列表中仍有数字,循环就会继续。

    1. 选择0和list.Length之间的随机索引
    2. 将此随机数放入随机列表
    3. 从有序列表中删除索引位置的项目。
  4. 像这样,您可以在随机列表中创建要包含的数字集,然后始终从有序列表中选择一个随机条目。使用这种技术,您还可以实现某些值在列表中多次出现。

    我不确定我的代码是否针对c#编译,因为我目前没有在这里运行visual studio,但我认为代码应该是正确的。

答案 2 :(得分:2)

这样的东西?

const int maxNumbers = 10;
List<int> numbers = new List<int>(maxNumbers);
for (int i = 0; i < maxNumbers; i++)
{
    numbers.Add(i);
}
Random r = new Random();
while (numbers.Count > 0)
{
    int index = r.Next(numbers.Count);
    Console.Write("{0} ", numbers[index]);
    numbers.RemoveAt(index);
}
Console.WriteLine();

编辑:对于任何随机数:

const int maxNumbers = 10;
const int biggestNumbers = 10000;
List<int> numbers = new List<int>(maxNumbers);
Random r = new Random();
while (numbers.Count < maxNumbers)
{
    int index = r.Next(biggestNumbers);
    if (numbers.IndexOf(index) < 0)
    {
        numbers.Add(index);
        Console.Write("{0} ", index);
    }
}
Console.WriteLine();