5

私は、多くの新聞の切り抜きを y テーブルにランダムに「投げる」必要があるアプリケーションに取り組んでいます。ただし、真のランダムを使用すると、すべてのクリッピングが 1 つの場所に表示される可能性が常にあります。クライアントは、より「等しい」ランダムな分布を好みます。

私の解決策の1つは、20個のクリッピングがある場合、20個のフィールドを持つグリッドを計算し、各クリッピングをそのフィールド内のランダムなx / y位置を持つフィールドに配置することでした.

誰もがより良い/より賢い解決策を持っていますか?

どうもありがとう!

4

4 に答える 4

1

ここで私は何をしますか....

切り抜きについてなので、視覚的な部分も重要だと思います...

テーブルを4つの部分(表面が等しい)と、テーブルの中心を表すもう1つの(重なり合う)部分に分割します。あなたはいつでも4の数で遊んでそれを6または8にすることができますが、私は20までは上がらないでしょう。

ここで、5つの部分にわたってランダムなx/y位置でクリッピングを分割します。

このように、テーブルの中心は常に「強力」になりますが、すべての切り抜きが1つの山にあるわけではないことを保証します。

于 2012-11-03T13:25:47.440 に答える
0

おそらく、この問題を解決する最も簡単な方法は、線形オブジェクトにフラット化することです。4 x 5 のグリッドは 20 個のリストになることがあります。各「スロット」に番号 (0 ~ 19) を指定し、次のアルゴリズムを使用します。Java を気にしないでください。

private void randomSlotFiller(int numberOfSlots) {
    List<Integer> list = new ArrayList<Integer>();
    Random random = new Random();
    for (int i = 0; i < numberOfSlots; i++) {
        list.add(i);
    }
    while(!list.isEmpty()) {
        System.out.print(list.remove(random.nextInt(list.size())) + " ");
    }
}

アルゴリズムは次のように機能します。

  1. 空のリストを作成する
  2. リストにスロット番号を入力してください
  3. 無作為にスロットを選択して削除します。

明らかに、数値を出力するだけではあまり効果がないため、必要に応じてコードを変更してください。

出力例は次のようになります。

15 9 17 13 8 10 6 11 3 7 2 19 4 0 12 18 16 5 1 14 

注: このアルゴリズムは、多くの反復ですべての「スロット」に均等に分散します。

于 2013-12-17T21:04:23.810 に答える
0

これは非常に単純なブルート フォース アプローチです。

  • すでに選択したポイントのリストを保持します。
  • n 個のランダムな点を選ぶ
  • それらの中から、リストのすべてのポイントへの最小距離が最大のポイントを選択し、他のポイントを破棄します
  • 選択したポイントのリストにそのポイントを追加します
  • ポイントが貯まるまで繰り返す

基本的には、常に複数のポイントを試し、以前に選択したすべてのポイントから最も遠いポイントのみを選択します。

実行時間は O(n²)

于 2013-12-17T21:45:24.440 に答える