我想用C++在0 - 2^64範圍內生成非常大的隨機數。我使用了rand()函數,但它不會生成很大的數字。任何人都可以幫忙嗎?如何在C++中生成非常大的隨機數
回答
用C++ 11,使用標準random library of 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;
}
如果您rand()
功能只適用於範圍[0, 2^15)
給出的數字,那麼您可以連接通過rand()
返回範圍[0, 2^64)
獲得數5個號碼。
當然,還有其他可能的解決方案(可能會更好)。 C++庫中的rand()
函數通常是linear congruential generator。你可以簡單地使用相同的數學原理實現你自己的發電機。
例如,下面的代碼生成64位的隨機數:
unsigned long long rand64()
{
static unsigned long long seed;
seed = seed * 6364136223846793005 + 1442695040888963407;
return seed;
}
參數6364136223846793005
和1442695040888963407
是那些使用高德納。
該方法的優點和缺點在上面的wiki頁面中討論。如果不需要高質量的隨機性,它可能是一個不錯的選擇。
爲什麼異或實際上?爲什麼20位的分段?你會詳細說明這些神奇的數字嗎? –
你能解釋一下return語句的邏輯嗎? –
32768只有2^15,所以這些20的位移不會填滿所有的位。 – interjay
我也會考慮使用操作系統設施。所有現代系統都有加密模塊,能夠生成任意長度的非常好的隨機字節數組。 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;
在這種情況下,隨機數
是從千萬到20000000
- 1. 生成非常大的隨機數java
- 2. C++在函數中生成隨機數
- 3. 大隨機數生成
- 4. 在C++中生成隨機雙數
- 5. 如何在django中生成隨機數
- 6. C++生成隨機數-1
- 7. C#生成隨機數
- 8. 如何在Dart中生成大的隨機數字?
- 9. 如何在Python中生成一個「大」的隨機數字?
- 10. 生成非重複的隨機數
- 11. c中的隨機數生成器#
- 12. 如何在C++中一次生成不同的隨機數?
- 13. 如何在c中生成唯一的隨機數字#
- 14. 如何在C中生成一個真正的隨機數?
- 15. 非均勻隨機數生成器
- 16. 如何在類中的函數中生成非重複的隨機數字?
- 17. 我如何使用隨機類在C#中生成一個隨機數(XNA)
- 18. 如何使用RNGCryptoServiceProvider生成非負數的隨機數(整數)C#
- 19. 在Java中生成數百萬個非重複的隨機數
- 20. 隨機數生成C++在CMD
- 21. 如何在C++中生成隨機二進制數字?
- 22. 如何在C#中生成一個隨機數?
- 23. 如何在程序集中生成隨機數生成器?
- 24. 如何生成隨機大小的面板? C#
- 25. c# - 如何生成隨機ITIN
- 26. 如何從短隨機數生成更長的隨機數?
- 27. 在C++中生成隨機文件名
- 28. 隨機數生成 - ARM7上的C
- 29. C++:如何從一個數組中生成一個隨機數
- 30. 生成隨機數
做了一些你想讓這個號碼成爲一個號碼本身?或者只是像哈希這樣的字符串?或者你更喜歡把一個很長的數字作爲一個字符串? –
你可能想參考:http://stackoverflow.com/questions/8120062/generate-random-64-bit-integer – Bettorun
「非常大」?一個簡單的'std :: uint64_t'可以包含所有這些值。 –