我尝试生成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,>
我在排列函数中做任何错误还是错过了什么? 谢谢您回答我的问题!
答案 0 :(得分:3)
这里有几处可以/必须改进的地方。
首先,我建议您使用std::shuffle
,而不要滚动您自己的版本。
使程序成为非法C ++的主要问题:如果x
为25
,则尝试写入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);
}
}