我想使用c++生成0-2^64范围内的非常大的随机数。我已经尝试使用rand()函数,但它不能生成非常大的数字。请问有谁能够提供帮助吗?
我想使用c++生成0-2^64范围内的非常大的随机数。我已经尝试使用rand()函数,但它不能生成非常大的数字。请问有谁能够提供帮助吗?
使用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;
}
myrnd %= 10000000000LL;
。 - Déjà vugetrandom()
。 Windows 有 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;
虽然回答有点晚,但这里提供一个简单的方法
我们知道在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)
范围内的数字。rand()
函数通常是一个线性同余生成器。您可以使用相同的数学原理简单地实现自己的生成器。unsigned long long rand64()
{
static unsigned long long seed;
seed = seed * 6364136223846793005 + 1442695040888963407;
return seed;
}
参数6364136223846793005
和1442695040888963407
是Donald Knuth使用的参数。
该方法的优缺点在上述维基页面中进行了讨论。如果不需要高质量的随机性,则这可能是一个不错的选择。
rand()
函数,它生成的随机数非常差。相反,请使用 <random>
中提供的工具。对于非常大的数字(大于 2^64),可以考虑使用 GMP 库中的函数。 - Jesper Juhl
std::uint64_t
可以容纳所有这些值。 - Kerrek SBrand()
在C++中不应该使用。 - Revolver_Ocelot[0,2^64)
,那么您可以跳过分配步骤,直接使用由std::mt19937_64
返回的值。 - Baum mit Augen