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

How to generate very Large random number in c++

本文关键字:非常 随机数 c++      更新时间:2023-10-16

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

使用 c++

11,使用 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;
}

现场演示

由于范围内

[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 引擎并不是最佳选择,为了更好的方法,请查看此内容。

另请注意,目前通常不鼓励使用rand。以下是Stephan T. Lavavej关于这个话题的演讲。

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

我写了生成随机 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 之间的数字。

回答线程很晚,但这里有一个简单的方法

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

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

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

如果你的rand()函数只给出[0, 2^15)范围内的数字,那么你可以将rand()返回的5个数字连接起来,得到一个[0, 2^64)范围内的数字。

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

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

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

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

这种方法的优缺点在上面的维基页面中讨论。如果不需要高质量的随机性,它可能是一个不错的选择。