关于不可重复的rand函数

时间:2019-03-04 16:08:25

标签: c++ arrays random repeat

我尝试生成25个数组,每个数组都应包含1到25的数字,且不能重复且顺序混乱。我执行了代码以生成数组,没有重复。当我尝试将数组映射到2D数组时,数组中有重复的数字。

这是我的代码

int permutation(int arraystore[]){

int item[25], index;
for (int x = 0; x < 25; x++)
    item[x] = x;                  //input values into item array

for (int x = 25; x > 0; x--) {
    index = rand() % x;     //generate random numbers
    arraystore[x] = item[index];
    while (index < x - 1) {             
        item[index] = item[index + 1];
        index++;
        }
    }
}

我将arraystore映射到main中的2d数组

int main(){
int ddarray[25][25];
for(int j=0;j<25)
    for(int i=0;i<25;i++){
        int array[25];
        permutation(array);
        ddarray[j][i]=array[i];
    }
}

以下是一些结果

192, 9 7 ,3, 11 ,20,18, 9 ,23,< strong> 11 ,21、5, 11 ,17、5、12, 11 ,3、10, 9 ,2 ,5, 7 7 ,19, 192, 5 ,0,14,23,22, 6 ,2, 20 ,24,13,12, 21 < / strong>,24, 21 ,6,11, 21 ,1, 20 5 ,8, 6 ,12,15, 192,21, 6 14 14 11 11 ,8 ,17、19、9, 24 22 6 24 11 2 22 6 ,13, 2 ,18、6、14、20,

我在排列函数中做任何错误还是错过了什么?

谢谢您回答我的问题!

2 个答案:

答案 0 :(得分:3)

这里有几处可以/必须改进的地方。

  • 首先,我建议您使用std::shuffle,而不要滚动您自己的版本。

  • 使程序成为非法C ++的主要问题:如果x25,则尝试写入arraystore[x],它已超过25个元素数组。您可能想写到arraystore[x-1]

  • 为您提供重复输出的主要问题:您正在为内部循环中的每个i随机分配一个新数组,然后仅使用第i个元素(因此您生成{{ 1}}个数组,每个数组包含25个元素)。以这种方式重复某些元素可能会发生(实际上,很有可能)。正确的25*25如下所示:

    main

    (请注意,原始代码中也缺少int main() { int ddarray[25][25]; for (int j=0; j<25; ++j) { int array[25]; permutation(array); for (int i=0; i<25; i++) { ddarray[j][i] = array[i]; } } } ...)

  • 您的++j的实现效率很低,因为它必须为每个输出元素移动很多元素。标准Fischer Yates shuffle只是交换当前输出和随机选择的索引中的元素。

  • 最后,我建议使用permutation(或std::array)而不是普通数组。后者使用起来非常不方便/令人惊讶(并且在运行时没有针对不同大小的标准支持)。

答案 1 :(得分:2)

基于std::shuffle的C ++ 11中的一个简单实现看起来像这样:

int main() {
   std::random_device rd;
   std::mt19937 g(rd());

   std::array<std::array<int, 25>, 25> ddarray;

   for (auto& a : ddarray) {
      std::iota(a.begin(), a.end(), 1);
      std::shuffle(a.begin(), a.end(), g);
   }    
}

实时演示:https://wandbox.org/permlink/0abgD0Yqv9K1B1D9