ホームページ  >  記事  >  バックエンド開発  >  golang rand が繰り返されない

golang rand が繰り返されない

WBOY
WBOYオリジナル
2023-05-09 22:35:36879ブラウズ

乱数はプログラミングでよく使用され、Golang には擬似乱数を生成する rand パッケージが用意されています。ただし、場合によっては、互いに異なる乱数のセットを生成する必要がある場合があります。この目標を達成するには、実現可能なアルゴリズムを検討する必要があります。

この記事では、非反復乱数を生成するいくつかの方法を紹介し、Golang rand パッケージを使用して非反復乱数を生成する方法を提供します。

方法 1: シャッフル アルゴリズム

シャッフル アルゴリズムでは、同じ範囲の数値の配列を 1 回ランダムに配置します。このアルゴリズムの時間計算量は O(n) です。この方法の欠点は、このアルゴリズムを使用して多数の乱数を生成すると、システムが大量のメモリを消費することです。

アルゴリズムは次のように実装されます:

  1. 範囲のある数値の配列を生成します。
  2. 範囲内の乱数を生成し、その数値を範囲内の別の数値と交換します。
  3. 必要な一意の番号がすべて生成されるまで、手順 2 を繰り返します。

方法 2: 拒否サンプリング アルゴリズム

拒否サンプリング アルゴリズムでは、生成された乱数をセットに保存し、次の乱数を生成するときにそのセットが同じ数値かどうかをチェックします。にはすでに存在します。存在する場合は、乱数を再生成します。このアルゴリズムの利点は、スペース効率の高いアルゴリズムであることです。ただし、生成する必要がある一意の数値の数が増えると、このアルゴリズムはさらに時間がかかる可能性があります。

アルゴリズムは次のように実装されます:

  1. 数値範囲、要素のターゲット数、および結果の配列を初期化します。
  2. 値の範囲内で乱数を生成し、その乱数を結果の配列に追加します。
  3. 結果の配列に含まれる数値の数がターゲットの数より少ない場合は、手順 2 を繰り返します。

方法 3: ビットマップ アルゴリズム

ビットマップ アルゴリズムでは、各ビットが範囲内の数値の有無を表すビットマップを作成します。このビットマップを使用して、生成した乱数のセットに特定の数値が既に存在するかどうかを追跡します。このアルゴリズムの利点は、時間と空間の効率が高いアルゴリズムであることです。

アルゴリズムは次のように実装されます:

  1. 数値範囲、要素のターゲット数、および結果の配列を初期化します。
  2. 各要素が範囲内の数値を表すビットマップを作成します。
  3. ランダムに数値を生成し、その数値に対応するビットマップ要素が 0 であるかどうかを確認します。ゼロの場合は番号が生成されていないことを意味し、それ以外の場合は番号が生成されたことを意味します。ビットマップ上のビットが 0 に等しい場合、そのビットは 1 に設定されます。
  4. 生成された一意の数値を結果の配列に追加します。結果の配列に含まれる数値が目標数よりも少ない場合は、手順 3 を繰り返します。

方法 4: Golang の rand パッケージの実装

Golang は、擬似乱数の生成に使用できる rand パッケージを提供します。これを使用して、非繰り返しの乱数を生成できます。

アルゴリズムは次のように実装されます:

  1. 数値範囲と要素のターゲット数を初期化します。
  2. Golang の rand パッケージを使用して乱数を生成し、結果の配列の最初の要素を保存します。
  3. 数値範囲内の数値をスライスに保存します。
  4. スライス内の結果の配列内の番号を見つけて削除します。これは、スライスでのインデックス操作を使用して実現できます。
  5. 結果の配列に必要な数の数値が含まれるまで、手順 2 と 4 を繰り返します。

上記の 4 つの方法は、非繰り返しの乱数を生成するために使用できますが、各アルゴリズムには長所と短所があります。どのアルゴリズムを使用するかはニーズによって異なります。重要性が空間にある場合はリジェクション サンプリング アルゴリズムを使用し、時間の経過とともに重要になる場合はビットマップ アルゴリズムを選択します。また、Golang を使用している場合は、 rand パッケージを直接使用して、単純かつ直接的かつ効率的な非反復乱数生成アルゴリズムを実装できます。

以上がgolang rand が繰り返されないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。