[英]How to generate very Large random number in c++
我想使用 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;
}
我也會考慮使用操作系統設施來代替。 所有現代系統都具有能夠生成任意長度的非常好的隨機字節數組的加密模塊。 Linux 有getrandom()
。 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;
在這種情況下,隨機數是一個從 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 使用的參數。
上面的 wiki 頁面中討論了這種方法的優缺點。 如果不需要高質量的隨機性,它可能是一個不錯的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.