簡體   English   中英

如何在c ++中生成非常大的隨機數

[英]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;
}

現場演示

由於[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() 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-sr​​and-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;
}

參數63641362238467930051442695040888963407是 Donald Knuth 使用的參數。

上面的 wiki 頁面中討論了這種方法的優缺點。 如果不需要高質量的隨機性,它可能是一個不錯的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM