2

それぞれが 1024 個の要素 0 または 1 を含むランダムな線形独立バイナリ ベクトルのシーケンスを継続的に生成しようとしています。1024 個 (取得できる最大値でもあります) を生成する必要があります。これが私がやったことの基本的な考え方です

srand( (unsigned) time(NULL) );
while(obtained <= 1024)
{
    for (int i=0;i<1024;i++)
        vector[i] = rand() % 2;

    check linear indepence against previously stored linearly independent vectors

    if (linearly independent)
        store it;
        obtained += 1;
    else
        discard;
 }

ただし、コードはここで 527 個の線形独立ベクトルしか生成できないようです。これは非常に奇妙です。srand() をループに入れた場合、つまり各 rand() 実行の前に、1024 個のそのようなベクトルの生成を完了することができるため、乱数ジェネレーターの問題である可能性があることがわかりました。ただし、プログラムは非常に遅くなります。

また、2 進体ではなく、ガロア体 GF(4) 以上から選択された要素から構成される 1024 個の 1024 次元ランダム線形独立ベクトルを生成したい場合、上記のコード セグメントが正常に機能することも興味深いです。

ここでの線形独立性は、有限体での操作に関するものであることに注意してください。

考えられる理由を説明し、検討すべき方向性を提案できる人はいますか? 心から感謝します。

4

2 に答える 2

2

の低品質の実装で C ライブラリを使用しているようですrand。たとえば、MSVC の CRT での実装は悪名高いです。

あなたが行っていることは、実際には、乱数ジェネレーターの品質を測定する一般的な統計テストと非常によく似ています。行列のランクテストは、ランダムなバイナリ行列を作成し、それらのランクを計算して、ランクの分布が予想される分布と一致するかどうかをテストします。基本的に、コードはフルランク バイナリ マトリックスの作成に失敗します。

より優れた RNG (おそらくサードパーティのライブラリから) を使用するか、次のいずれかを試すことができます。

  • によって返される値の別のビットを使用しますrand
  • rand一定回数繰り返した後に再度呼び出し、値を破棄します。1024 は 2 のべき乗であるため、これがランダムな値で何らかの繰り返しが発生する原因になる可能性があります。
  • の 1 回の呼び出しでより多くのビットを使用しますrand。システムの RAND_MAX の値を確認してください。
于 2013-10-20T21:28:38.040 に答える
0

GNU Scientific Library (GSL) の RNG を使用して問題を解決できたことを嬉しく思います。現在、gsl_rng_mt19937RNG は UNIX 標準の rand() の代わりに使用されています。

于 2013-10-21T16:32:11.647 に答える