我需要在C ++中创建算法实现以生成没有重复和列表的fe表的随机数。
我创建了类似的代码,但是当我在控制台程序中将n = 32769停止工作时,它将停止工作。当我将数字设置在0-32768范围内时,它起作用。知道这段代码有什么问题吗?在编译时,我没有错误/警告。
#include <stdio.h> #include <iostream> #include <ctime> int main() { clock_t start = clock(); int n; std::cout << "n:"; std::cin >> n; bool *used_numbers = new bool[n]; memset(used_numbers, false, sizeof(used_numbers[0]) * n); int *permutation = new int[n]; srand(unsigned(std::time(NULL))); int rnd_number; for (int i = 0; i < n; i++) { rnd_number = rand() % n; if (!used_numbers[rnd_number]) { permutation[i] = rnd_number; used_numbers[rnd_number] = true; } else i--; } std::cout << "Permutation: \n "; for (int k = 0; k < n; k++) { std::cout << permutation[k] << " "; } std::cout << std::endl; printf("[Debug]: %lu ms\n", clock() - start); getchar(); system("pause"); return 0; }
rand() % n
绝对不会给您大于RAND_MAX的数字。RAND_MAX是rand()生成的数字范围。
如果使用大于RAND_MAX的n值,则在绘制第一个RAND_MAX数字后将永远循环。简而言之,没有可绘制的数字。
您需要改进解决方案,以便能够生成更大的数字,或者使用更好的方法,例如将更大的数字列表改组。
您的算法有很多问题,但直接的简单解决方法是:
rnd_number = (rand() * (RAND_MAX + 1) + rand()) % n;