所以我有点卡在这个上面。我一直在努力寻找几个小时,我还没有找到一个适合我教授非常严格的参数的解决方案。
我必须用0-9的数字随机排列来填充数组,它们不能重复。我知道有很多这方面的主题,我发现了一些方法,但它不符合我们的要求。
所以我必须使用常规数组和带有给定种子的Random对象来填充具有唯一值的数组。我不能使用集合,ArrayLists,任何类型的迭代器,只是常规循环。我甚至不能创建另一个类来完成这个功能 到目前为止我的基本想法
for(int i=1; i<numItems; i++)
{
int count = 1;
int m=rand.nextInt(numItems);
for(int j=0; j<i; j++)
{
if(m==permutation[j])
{
m=rand.nextInt(numItems);
count++;
j=-1;
}
}
permutation[i]=m;
numAttempts[i]=count;
}
这很好用,但是我们不能修改循环内部的控制变量(j)。
我基本上希望它从一开始就用rand对象在if语句为真时产生的随机数开始测试。
非常感谢任何帮助。
编辑:他的输出
答案 0 :(得分:0)
示例中使用的算法似乎是:
1. Draw number from PRNG
2. Scan every previous entry in array to check if value is present
3. If yes, go to 1
4. Assign number to this entry
5. Proceed to next entry
6. Go to 1
numAttempts
似乎是必须为每个条目重新绘制的次数。您可以通过不随机绘制最后一个条目来大幅优化其实现,而只是利用分配n-1
个条目后,n
个条目只有一种可能性。
答案 1 :(得分:0)
所以查看所需的输出,你的算法应该是:
对于每个号码我,选择随机数,直到你得到一个你没有选择的号码。然后将该数字放入数组中,并记录在获得新数字之前必须选择的数字。
所以,重构你的代码以使用循环而不是将j
重置为-1:
for(int i=1; i<numItems; i++)
{
int count = 0;
bool found = false;
do {
int m=rand.nextInt(numItems);
count++;
for(int j=0; j<i; j++)
{
if(m==permutation[j])
{
found = true;
break;
}
}
} while (found);
permutation[i]=m;
numAttempts[i]=count;
}
(我的java生锈了,语法可能有问题,但我希望你能得到这个想法)