如何在c ++中生成非常大的随机数

时间:2016-05-23 16:40:11

标签: c++

我想用c ++生成0到2 ^ 64范围内的非常大的随机数。我使用了rand()函数但它没有生成非常大的数字。任何人都可以帮忙吗?

6 个答案:

答案 0 :(得分:12)

使用c ++ 11,使用标准random library of c++11,您可以这样做:

#include <iostream>
#include <random>

int main()
{
  /* Seed */
  std::random_device rd;

  /* Random number generator */
  std::default_random_engine generator(rd());

  /* Distribution on which to apply the generator */
  std::uniform_int_distribution<long long unsigned> distribution(0,0xFFFFFFFFFFFFFFFF);

  for (int i = 0; i < 10; i++) {
      std::cout << distribution(generator) << std::endl;
  }

  return 0;
}

Live Demo

答案 1 :(得分:5)

由于[0, 2^64)范围内的均匀随机数只是64个随机位,您可以直接使用std::mt19937_64的返回值:

#include <random>

int main () {
    std::mt19937_64 gen (std::random_device{}());

    std::uint64_t randomNumber = gen();
}

请注意,使用单个32位种子播种Mersenne Twister引擎不是最佳选择,为了更好的方式,请查看this

另请注意,目前通常不鼓励使用randHere是Stephan T. Lavavej关于该主题的演讲。

答案 2 :(得分:1)

我也会考虑使用操作系统设施。所有现代系统都具有能够生成任意长度的非常好的随机字节数组的加密模块。 Linux有getrandom()。 Windows有CryptGenRandom。 OpenBSD有arc4random。 iOS有SecRandomCopyBytes。等等。

答案 3 :(得分:1)

我编写了生成随机19位数字的函数它与标准rand()函数完全一样。它从19位数字中抽取每个数字并将它们存储在一个数组中,然后将它们组合在一起以形成非常大的随机数。

unsigned long long Randomize()
{
    unsigned long long randnumber = 0;
    int digits[20];

    for (int i = 19; i >= 1; i--)
    {
      digits[i]=rand()%10:
    }
    for(int i=19; i>=1; i--)
    {
       unsigned long long power = pow(10, i-1);

        if (power%2 != 0 && power != 1)     //eliminates "bug" (which comes from long long power is not a float))
            power++;

        randnumber += power * digits[i];
    }
return randnumber;
}

要使用此功能,您需要实现少量库

#include <stdlib.h>
#include <time.h>
#include <math.h>

示例:

srand(time(NULL));
randomnumber = Randomize()%10000000+10000000;

在这种情况下,随机数是一个从10000000到20000000的数字。

答案 4 :(得分:0)

该回答该线程了,但这是一种简单的方法

我们知道,c ++中的rand()可以生成接近32767的随机数(来源:https://www.geeksforgeeks.org/rand-and-srand-in-ccpp/) 但是,如果我们做这样的事情:

long long random_num = (rand() * rand()) % 1000000000

然后可以保证生成一个比32767大得多的随机数。模数将确定随机数中的位数。

答案 5 :(得分:-3)

如果您的rand()函数仅提供[0, 2^15)范围内的数字,那么您可以连接rand()返回的5个数字,以获得[0, 2^64)范围内的数字。< / p>

当然,还有其他可能的解决方案(可能更好)。 C ++库中的rand()函数通常是linear congruential generator。您可以使用相同的数学原理简单地实现自己的生成器。

例如,以下代码生成64位随机数:

unsigned long long rand64()
{
    static unsigned long long seed;
    seed = seed * 6364136223846793005 + 1442695040888963407;
    return seed;
}

参数63641362238467930051442695040888963407是Donald Knuth使用的参数。

上述维基页面讨论了此方法的优缺点。如果不需要高质量的随机性,那么它可能是一个不错的选择。