乱数はプログラミングでよく使用され、Golang には擬似乱数を生成する rand パッケージが用意されています。ただし、場合によっては、互いに異なる乱数のセットを生成する必要がある場合があります。この目標を達成するには、実現可能なアルゴリズムを検討する必要があります。
この記事では、非反復乱数を生成するいくつかの方法を紹介し、Golang rand パッケージを使用して非反復乱数を生成する方法を提供します。
方法 1: シャッフル アルゴリズム
シャッフル アルゴリズムでは、同じ範囲の数値の配列を 1 回ランダムに配置します。このアルゴリズムの時間計算量は O(n) です。この方法の欠点は、このアルゴリズムを使用して多数の乱数を生成すると、システムが大量のメモリを消費することです。
アルゴリズムは次のように実装されます:
方法 2: 拒否サンプリング アルゴリズム
拒否サンプリング アルゴリズムでは、生成された乱数をセットに保存し、次の乱数を生成するときにそのセットが同じ数値かどうかをチェックします。にはすでに存在します。存在する場合は、乱数を再生成します。このアルゴリズムの利点は、スペース効率の高いアルゴリズムであることです。ただし、生成する必要がある一意の数値の数が増えると、このアルゴリズムはさらに時間がかかる可能性があります。
アルゴリズムは次のように実装されます:
方法 3: ビットマップ アルゴリズム
ビットマップ アルゴリズムでは、各ビットが範囲内の数値の有無を表すビットマップを作成します。このビットマップを使用して、生成した乱数のセットに特定の数値が既に存在するかどうかを追跡します。このアルゴリズムの利点は、時間と空間の効率が高いアルゴリズムであることです。
アルゴリズムは次のように実装されます:
方法 4: Golang の rand パッケージの実装
Golang は、擬似乱数の生成に使用できる rand パッケージを提供します。これを使用して、非繰り返しの乱数を生成できます。
アルゴリズムは次のように実装されます:
上記の 4 つの方法は、非繰り返しの乱数を生成するために使用できますが、各アルゴリズムには長所と短所があります。どのアルゴリズムを使用するかはニーズによって異なります。重要性が空間にある場合はリジェクション サンプリング アルゴリズムを使用し、時間の経過とともに重要になる場合はビットマップ アルゴリズムを選択します。また、Golang を使用している場合は、 rand パッケージを直接使用して、単純かつ直接的かつ効率的な非反復乱数生成アルゴリズムを実装できます。
以上がgolang rand が繰り返されないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。