1

一意の乱数を生成してデータベースに保存するアプリケーションに取り組んでいます。HTTP リクエストを介して番号が存在するかどうかを確認します。最初は、約 10,000 の数値を使用します。

これは正しいアプローチですか?

  1. 乱数を生成し、それらを 1 つずつ配列に格納し、配列の一意性をチェックし続け、配列が完成したら、配列全体を並べ替えた後にデータベースに格納します。
  2. データベースを使用して、番号が存在するかどうかを確認します。

アプリケーションは最大 100 万個の数値まで拡張できるため、どのデータベースを使用する必要がありますか。

4

2 に答える 2

1

いくつかの考え:

  1. 10 個または 10,000 個の「乱数」を格納している場合、それらがランダムにデータベースに入力されるかどうか、またはデータベースが 10,000 個の連続した数字の範囲からランダムに 1 つの数字を選択するかどうかによって、どのような違いが生じるでしょうか? 二重乱数選択が必要ですか? MySQL、PostgreSQL、およびその他の DBM は乱数を生成でき、乱数ジェネレーターを使用して行を取得できるため、ジェネレーターから直接値を返すか、行を取得することができます。いずれにせよ、Ruby がランダムな値を作成することについて心配する必要はありません。「3 重」の乱数が本当に必要な場合を除きます。範囲の値をデータベースに貼り付けて、(1..10_000)その部分が完了したと呼び、クエリを実行してレコードをランダムに取得します。
  2. 本当に乱数が必要な場合は、一意性を保証できません。疑似ランダムに満足している場合でも、特定のセッションで以前に使用した数値を追跡しない限り、範囲内から重複を返す可能性があるため、まだ問題があります。サイトの人気が高まると、多数のセッションで一意性を追跡する方法が興味深い問題になるでしょう。

もし私がこれをしていたら、プロセスの一部を逆にします。「乱数」の値をデータベースに保存するのではなく、Ruby に組み込まれている乱数ジェネレーターを使用してから、おそらくデータベースをチェックして、その特定のセッションでその数値を以前に生成したことがあるかどうかを確認します。全体として、データベースに格納される値が少なくなるため、一意性を判断するためのルックアップが高速になります。

これは依然としてコーディングが厄介なシステムであり、時間の経過とともにセッションの「一意の」レコードが増加するにつれて非効率的になります。

データベースなしでこれを行うには、次のようなものを使用してランダム/一意の範囲を作成しarray = (1..10_000).to_a.shuffle、値が必要になるたびにpop、ランダム化された配列から最後の値を取得するために使用します。すべてのセッションのその値のプールから、使い果たされるまで引き出してから、再生成したくなるでしょう。その時点で「一意の」値が重複する可能性がありますが、同じ数値が 2 回続けて現れる可能性はかなり低いはずです。

于 2013-04-27T14:53:32.060 に答える