关于非重复兰特功能
About a non-repeat rand function
我试图生成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 的主要问题:如果
x
是25
,则尝试将其写入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。
- 有没有可能有一个只有ADL才能找到的非好友功能
- 在功能块中使用新运算符时存在于堆或堆栈上?
- 是否有任何模式等效于虚拟模板功能?
- 非静态成员引用必须相对于特定对象
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- C 中的非重复数组值
- 为什么默认参数不能依赖于非默认参数?
- 为什么参数匹配适用于非模板版本,但不适用于模板版本
- §9.5.1 中的注释可以应用于非类类型吗?
- std::vector 适用于非默认可构造的类
- 在mac上用c++编写独立游戏程序需要哪些软件(从软件功能而非名称来看)
- 专用于非模板类的模板化构造函数
- 专用于非模板类的可变参数模板成员函数
- 如果将 delete[] 应用于非数组指针会发生什么情况
- 在非静态成员函数中使用时依赖于非静态成员的名称
- 如何将函数静态应用于非类型模板包的各个元素并对结果求和
- 自动将本地缩放应用于非全屏桌面连接(RDP 8.1及更高版本)
- 在C++中生成随机非重复数数组
- 为什么thread_local不能应用于非静态数据成员,以及如何实现线程本地非静态数据成员
- Mingw依赖于非windows本机DLL