如何在 c++ 中生成非常大的随机数
How to generate very Large random number in c++
我想使用 c++ 生成 0 - 2^64 范围内的非常大的随机数。我使用了 rand() 函数,但它没有生成很大的数字。有人可以帮忙吗?
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;
}
参数6364136223846793005
和1442695040888963407
是Donald Knuth使用的参数。
这种方法的优缺点在上面的维基页面中讨论。如果不需要高质量的随机性,它可能是一个不错的选择。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 整数不会重复超过随机数
- OpenGL大的3D纹理(>2GB)非常慢
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- if数组上的随机数
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 半随机数生成C++
- 程序在尝试猜测它选择的随机数时进入无限循环?
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 使用浮点数和双精度数的非常小数字的数学
- 有没有办法在 c++ 中同时生成随机数?如果没有,是否有解决方法?
- 具有随机数的二维数组不会更改
- 随机数未达到限制
- 我想生成许多矩阵并用随机数填充它
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- 制作具有平均值的随机数生成器
- 在打开多个其他窗口时使用全屏窗口时帧速率非常低
- 如何在 c++ 中生成非常大的随机数
- C++从1到非常大的数字(例如2500万)的随机数