【发布时间】:2017-08-22 12:54:43
【问题描述】:
我正在尝试生成一个指定大小的数组,用随机整数填充它,然后遍历该数组以检查是否没有重复项。我在测试时遇到了一些不一致的地方。想知道是否可以使用嵌套的 for 循环来完成,或者是否建议了更好的方法?
class Program
{
static void Main(string[] args)
{
int size = 10;
int[] newArray = InitializeArrayWithNoDuplicates(size);
for (int i = 0; i < newArray.Length; i++)
{
Console.WriteLine( newArray[i]);
}
Console.ReadKey();
}
static Random rng = new Random();
public static int[] InitializeArrayWithNoDuplicates(int size)
{
int minValue = 1;
int maxValue = 10;
int[] array = new int[size] ;
for (int i = 0; i <array.Length; i++)
{
array[i] = rng.Next(minValue, maxValue);
for (int j = i+1; j < array.Length-1; j++)
if (array[i] == array[j])
{
array[i] = rng.Next(minValue, maxValue);
}
}return array;
}
}
【问题讨论】:
-
很难找到 10 个在 1..10 范围内没有重复的随机整数;) 如果您在不增加允许范围的情况下增加数组的大小,程序将无法完成任务!
-
您将数组从
0填充到length-1,对吗?但是,一旦你设计了一个新的i-th 项目,你将它与索引i+1到array.length-1处的数组的未初始化部分进行比较,而不是与那些已经在0到i-1填充的部分进行比较。 ..!您希望它如何确保价值的唯一性? -
@CiaPan - 这不是一个难题。一点儿都没有。每个模拟一副纸牌的程序都解决了这个确切的问题,并且“问题规模”超过了 5 倍。 OP的做法是错误的,但这和问题难不一样。
-
@MarkAdelsberger 如果我看到一个程序通过随机猜测卡片并丢弃重复卡片来“发牌”,我会停止与它的作者合作并自己编写程序。它在 IMO 的 bogosort 旁边。选择 K 张牌的更快、一次性且无重复检查的方法是洗牌并取前 K 个物品。或者生成 K 个随机索引(允许重复)以减少牌组,并在每次迭代中在生成的索引处删除一张牌。
-
@CiaPan - 您不理解“OP 的方法错误”的哪一部分?您只是描述了一种不同的算法,用于“查找 [ing] [n] 随机 ... 在 1..[n] 范围内没有重复的数字”。想嚣张,先尝试正确。
标签: arrays duplicates