关于非重复兰特功能

About a non-repeat rand function

本文关键字:功能 于非重      更新时间:2023-10-16

我试图生成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++;
        }
    }
}

i将阵列映射到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 9 23, 11 ,21,5, 11 ,17,5,12, 11 ,3,10, 9 ,2,5, 7 7 ,19,19,192, 5 ,0,14,23,22, 6 ,2, 20 ,24,13,12, 21> 21 ,24, 21 ,6,11, 21 ,1, 20 5 6 ,12,15,192,21, 6 14 14 11 11 ,8,17,19,9, 24 22 6 24 11 11 , 2 22 6 ,13, 2 ,18,6,14,20,p>我在排列功能上做错了还是错过了某些东西?

谢谢您回答我的问题!

这里必须/必须有几件事。

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

  • 使您的程序非法C 的主要问题:如果x25,则尝试将其写入arraystore[x],这已经超过了25个元素数组的末尾。您可能想写入arraystore[x-1]

  • 为您重复输出的主要问题:您正在为内循环中每个i的新数组随机化一个新数组,然后仅使用i TH元素(因此您生成了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 ...

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

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

基于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。