2012-02-29 17 views
2

システムのテストとデバッグのためにCで乱数を生成する必要があります。システムは、限られた数の関数を持つカスタムハードウェア(SoC)であるため、基本的な数学演算しか使用できません。C乱数生成(純粋なCコード、ライブラリまたは関数なし)

いいえ、私はstdlibまたはmath.hで乱数ジェネレータを使用できません。私はそれを自分で書く必要があります。だから乱数を生成するためのアルゴリズムのいくつかの並べ替えはありますか?

ここで私のワークステーションで数字を生成してモジュールに埋め込むのが簡単な解決策だとわかっていますが、私はそれをしたくありません。

答えて

5

乱数生成器は、基本的に開始種から再帰的に実行される特別な*ハッシュ関数です。

私はMurmurHash2 algorithmをC#コードで使用しています。非常に高速で実装が簡単で、衝突率の低い状態でテストされています。このプロジェクトは、私が値にハッシュ関数を実行すると、別の一見ランダム(ただし確定)を返すべきであるという意味では、特別なことでC.


*に簡単に変換可能でなければならないC++で書かれた、いくつかの異なるオープンソースのハッシュ関数を持っています出力はパターンを形成しないように見える。また、戻り値の分布は一様分布でなければなりません。

+0

の一部として利用可能であるIsaacを試してみてください絶対にありません! MurmurHashは、比較的新しいハッシュアルゴリズムであり、多くの欠陥とそれに適用された多くの修正があり、アルゴリズムが弱いという良い兆候です。確かに、擬似乱数を生成するために使用することはできますが、誰も暗号操作にそれを使用するべきではありません。 – adelphus

+0

@ adelphus-私は暗号の専門家ではないので、私はその声明を削除しますが、暗号化されているということは、単に良い分布、低い衝突、低いバイアスを意味すると考えました。 @Peter O.-良いキャッチ:私は確かに制服を意味した。おっとっと。 – dlras2

1

あなたはGeorge MarsagliaのMultiply-with-carryを試すことができます。ウィキペディアから

コード:

#include <stdint.h> 

#define PHI 0x9e3779b9 

static uint32_t Q[4096], c = 362436; 

void init_rand(uint32_t x) 
{ 
    int i; 

    Q[0] = x; 
    Q[1] = x + PHI; 
    Q[2] = x + PHI + PHI; 

    for (i = 3; i < 4096; i++) 
      Q[i] = Q[i - 3]^Q[i - 2]^PHI^i; 
} 

uint32_t rand_cmwc(void) 
{ 
    uint64_t t, a = 18782LL; 
    static uint32_t i = 4095; 
    uint32_t x, r = 0xfffffffe; 
    i = (i + 1) & 4095; 
    t = a * Q[i] + c; 
    c = (t >> 32); 
    x = t + c; 
    if (x < c) { 
      x++; 
      c++; 
    } 
    return (Q[i] = r - x); 
} 
0

CACMの10月88号の記事でParkとMillerが記事を掘り起こすだけです。

彼らが提案する一般的なアルゴリズムは以下のとおりです。

a = 16807; 
m = 2147483647; 
seed = (a * seed) mod m; 
random = seed/m; 

記事は、いくつかの改良を含んでいるけれども。

0

gsl libraryのソースコードを確認してください。よくテストされたアルゴリズムのいくつかが実装されています。

0

あなたは「..hasは非常に暗号学健全であることをテストされて」もCCAN here

関連する問題