我正在尝试创建一个产生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:我现在已经纠正了所有错误,但是这段代码不起作用,因为数字不是唯一的!我已将上面的代码更新到最新版本。我提前帮助解决这个问题!谢谢!
答案 0 :(得分:7)
答案 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);
}
用文字解释,这就是你所做的:
输入循环。只要有序列表中仍有数字,循环就会继续。
像这样,您可以在随机列表中创建要包含的数字集,然后始终从有序列表中选择一个随机条目。使用这种技术,您还可以实现某些值在列表中多次出现。
我不确定我的代码是否针对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();