使用随机排列填充数组

时间:2014-01-24 02:40:11

标签: java arrays random

所以我有点卡在这个上面。我一直在努力寻找几个小时,我还没有找到一个适合我教授非常严格的参数的解决方案。

我必须用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语句为真时产生的随机数开始测试。

非常感谢任何帮助。

编辑:他的输出enter image description here

2 个答案:

答案 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生锈了,语法可能有问题,但我希望你能得到这个想法)