2010-12-11 14 views
0

乱数を生成するデバイスから受信したバイトの配列から乱数を生成する必要があるプログラムを開発しています。問題は;デバイスは、乱数をバイトのストリームとして送信し、特定の値の整数を生成する必要があります。言い換えれば:バイト配列から特定の値の間にランダムな整数を生成する方法

int GenerateRandom(int min, int max, byte[] rndr) { 
//Do something with the bytes to make a random integer here between min and max 
} 

いいえ、私はプログラムが安全な情報を暗号化するために使用されるため、.NETにランダムクラスを内蔵しており、擬似乱数ジェネレータはないだろうを使用することはできません受け入れられる。

+0

@Mitch:重複する質問へのリンクを投稿できますか? –

+0

C# – IDWMaster

+0

の具体的な回答が必要です例を挙げて何をしたいですか? –

答えて

3

java.util.Randomクラスのsource codeがお手伝いできます。私は知っている、私は知っている、それはC#ではないが、まだdownvoteしないでください。アルゴリズムは重要なビットです。ランダムビットのソースを指定すると、0とnの間の整数が生成されます。範囲[0..n]を[min..max]に変換するのはかなり簡単です。

C#にも同様のコードで、同じアルゴリズムを実装できると確信しています.2つの閉じ括弧と2行の入力検証を含む約12行です。

編集:nextInt(int n)機能は、見たいものです。

EDIT2:または、RNGCryptoServiceProviderを高品質のランダムビットでシードして使用することもできます。それはあなたの目的のために十分安全であるかもしれません。特に、新しい、高品質のランダム性で頻繁に再読することができるならば。

興味深いことに、msdnウェブサイトは、LinuxのChromeでは正しく動作しません。誰がサンクしたでしょうか?

+0

もし彼が本当にアルゴリズムを必要とするなら、これを実装するのはC#が難しすぎるとは限りません。 – ProfK

+0

ありがとうございます。これは完全に機能しました。私はJavaアルゴリズムを使用しました。 – IDWMaster

0

暗号化された強力な乱数が必要な場合は、.NETフレームワークにこの目的のためにRNGCryptoServiceProviderクラスがあります。

GetBytes()は、乱数の暗号的に強いシーケンスでバイト配列を埋めます。

+0

RNGCryptoServiceProviderは、OPのランダム性のソースと同じほど良好ではありません。質問から: "疑似乱数生成器は受け入れられません"。 RNGCryptoServiceProviderはまだ擬似ランダムですが、バニラのRandomクラスより優れています。 –

0

このバイト配列に既に乱数が含まれている場合は、その値をサンプル値として使用できます。この例では最初の4バイトを使用していますが、適用できるワードサイズに合わせてこれを変更し、ワードを回転させることができます。

static int GenerateRandom(int min, int max, byte[] rndr) 
{ 
    int isamp = (int)(((uint)rndr[3] << 24) | ((uint)rndr[2] << 16) | ((uint)rndr[1] << 8) | ((uint)rndr[0])); 
    if (isamp < 0) 
     isamp += int.MaxValue; 
    double samp = isamp * 4.6566128752457969E-10; 
    return (int)(samp * (max - min)) + min; 
} 
+0

これは出力間隔から同じような可能性のある値にはなりません。 – CodesInChaos

+0

これは入力シードの分布に依存します。これは、入力と同じように分散されています。 – Tergiver

関連する問題