一尘不染

C ++无重复随机数生成器

algorithm

我需要在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;
}

阅读 256

收藏
2020-07-28

共1个答案

一尘不染

rand() % n

绝对不会给您大于RAND_MAX的数字。RAND_MAX是rand()生成的数字范围。

如果使用大于RAND_MAX的n值,则在绘制第一个RAND_MAX数字后将永远循环。简而言之,没有可绘制的数字。

您需要改进解决方案,以便能够生成更大的数字,或者使用更好的方法,例如将更大的数字列表改组。

您的算法有很多问题,但直接的简单解决方法是:

rnd_number = (rand() * (RAND_MAX + 1) + rand()) % n;
2020-07-28