2012-01-25 7 views
0

例:1589745896214758962147852は、長さ25の乱数を生成します。

これは私がしばらくの間スローガンしている質問です。 可能な方法は何ですか? ベストプラクティスは何ですか?

+0

それは負の数とすることができます。 – Kameron

+2

その後、サインも生成します。 –

+0

これは25桁未満の数字を排除していますか? – Clifford

答えて

1

これは良い質問です...

OpennSsl BIGNUMを使用できます。

これは簡単な例です。

#include <stdio.h> 
#include <openssl/bn.h> 

int main(int argc, char **argv) 
{ 
    BIGNUM *fat; 
    BN_ULONG a, f; 
    char *resp; 
    int i; 

    fat = BN_new(); 

    for (i = 1; i < argc; i++) { 

     f = atoll(argv[i]); 

     BN_dec2bn(&fat, "1"); 
     for (a = 2; a <= f; a++) { 
      BN_mul_word(fat, a); 
     } 

     resp = BN_bn2dec(fat); 

     printf("Fatorial of %s = %s\n", argv[i], resp); 
    } 
    return 0; 
} 

私はより良い例をdicovered:

#include <stdio.h> 
#include <openssl/bn.h> 

int main(int argc, char **argv) 
{ 
    BIGNUM *fat; 
    char *resp = NULL; 

    fat = BN_new(); 

    BN_generate_prime(fat, 80, 1, NULL, NULL, NULL, NULL); 

    resp = BN_bn2dec(fat); 

    printf("Big Random Value: %s\n", resp); 

} 

;)

7

乱数ジェネレータを各桁ごとに25回呼び出すことができます。これを文字列として使用する場合は単純です。

利用できる乱数関数がない場合は、実装が簡単です。 enter image description here

http://xkcd.com/221/

+2

ボーナスポイントができますか? –

+0

著作権で保護されている素材を使用しているとは思われません。 – Clifford

+0

@Cliffordそれは非公開(SOと同じですが)ですが、SOイメージキャッシュはイメージ内のリンクを削除したので、追加しました。 –

1

あなたはあなたの番号を保存するための文字列に対処する必要があります。

署名長い長い分には、-9223372036854775808あるとmaxは9223372036854775807

1589745896214758962147852ではるかに長いため。

0

あなたの問題は、(執筆の時点で)うまく定義されていません。

正確に25桁が必要な場合は、単純に25回反復して0から9までの乱数を取得し、数字の文字列にコンパイルすることができます。

は25桁の番号(すなわち、10 < = R < = 10 -1)よりもむしろ25個のランダムな数字、最初の数字が> = 1(なし先行ゼロ)しなければならないでなければならない場合。

これらの数字が数字の文字列ではなく算術演算を実行する整数値を表すようにする必要がある場合は、Cの組み込みデータ型が不安定になります。値には少なくとも85ビット(1/log(2))が必要です。

標準乱数ジェネレータから返されたビットを連結して、85ビット表現を構築することができます。標準Cライブラリのrand()関数を使用する場合、実装のRAND_MAX値を確認してください。実装によっては16ビットしか生成されないため、ランダムビットの単語全体ではない可能性があるため、連結するためにはいくつかの注意が必要です。しかし、そのような数値を算術的に操作するには、それを行う算術関数を作成する必要があります(または "bignum"ライブラリを使用する)。

関連する問題