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

Nab*_*zal 6 c++

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

coy*_*508 14

使用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;
}
Run Code Online (Sandbox Code Playgroud)

Live Demo

  • @Nabeel_Afzal此解决方案确实生成[0,2 ^ 64-1]范围内的数字.但由于这些数字是纯随机的并且在该区间内均匀选择,因此[2 ^ 56,2 ^ 64]比[0,2 ^ 56]大100倍以上,所生成的数字的99%将超过2 ^ 56. (3认同)

Bau*_*gen 6

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

#include <random>

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

    std::uint64_t randomNumber = gen();
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是播种梅森倍捻机引擎与一个32位的种子是不是最佳的,更好的方式,看看这个.

另请注意,rand这些天通常不鼓励使用.以下是Stephan T. Lavavej关于该主题的演讲.