1

我正在尝试创建一种产生 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:我现在已更正所有错误,但此代码不起作用,因为数字不是唯一的!我已将上面的代码更新为最新版本。我希望有一些帮助来解决这个问题!谢谢!

4

3 回答 3

7

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

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

编辑:

这是 C# 实现的链接:http: //www.dotnetperls.com/fisher-yates-shuffle

于 2012-08-16T12:54:09.537 回答
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. 从有序列表中删除索引位置的项目。

像这样,您可以在随机列表中创建一组数字,然后总是从有序列表中选择一个随机条目。使用此技术,您还可以实现某些值在列表中多次出现。

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

于 2012-08-16T12:53:30.703 回答
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();
于 2012-08-16T12:59:09.763 回答