免責事項:私はRNGで「ちっぽけ」しかなく、1年以上前です。
あなたがLinuxボックスを使用している場合、解決策は比較的単純で非決定論的です。 /dev/urandom
から希望のビット数だけ開いて読んでください。しかし、あなたのプログラムにたくさんのランダムビットが必要な場合は、/dev/urandom
のビット数をPRNGのシードとして使用したいかもしれません。
boostは、多数のPRNGと、非確定的なRNG、random_deviceを提供します。 random_deviceは、Windows上では全く同じ/dev/urandom
を使用し、Windowsでは同様の(IIRC)機能を使用するため、Windowsまたはx-platformが必要な場合に使用します。
もちろん、GMPのタイプと機能を使用して、あなたの好きなRNGに基づいて関数を記述したいと思うかもしれません。
編集:
#include<stdio.h>
#include<gmp.h>
#include<boost/random/random_device.hpp>
int main(int argc, char *argv[]){
unsigned min_digits = 30;
unsigned max_digits = 50;
unsigned quantity = 1000; // How many numbers do you want?
unsigned sequence = 10; // How many numbers before reseeding?
mpz_t rmin;
mpz_init(rmin);
mpz_ui_pow_ui(rmin, 10, min_digits-1);
mpz_t rmax;
mpz_init(rmax);
mpz_ui_pow_ui(rmax, 10, max_digits);
gmp_randstate_t rstate;
gmp_randinit_mt(rstate);
mpz_t rnum;
mpz_init(rnum);
boost::random::random_device rdev;
for(unsigned i = 0; i < quantity; i++){
if(!(i % sequence))
gmp_randseed_ui(rstate, rdev.operator()());
do{
mpz_urandomm(rnum, rstate, rmax);
}while(mpz_cmp(rnum, rmin) < 0);
gmp_printf("%Zd\n", rnum);
}
return 0;
}
出典
2012-03-23 21:32:33
dB8
新しい暗号を実装し、悪いカルマをもたらすもの発電機を使用するために知りません。非常に悪いカルマ!! http://security.stackexchange.com/questions/2202/lessons-learned-and-misconceptions-regarding-encryption-and-cryptology –
http://www.lysator.liu.se/~nisse/nettle/nettleを参照してください。 html#GMPのメンテナーの一人が書いた暗号ライブラリのランダム性。 –