2012-11-03 138 views
5

我正在研究一個應用程序,在這個應用程序中,大量的剪報應該在y桌面上隨機「拋出」。然而,如果使用真正的隨機數,那麼總是有可能所有的剪輯出現在一個地方。 客戶會更喜歡更「平等」的隨機分配。尋找一個好的算法來平均分配

我的一個解決方案是: 如果我有20個剪報,計算一個有20個字段的網格,然後將每個剪輯放在該字段中隨機x/y位置的字段中。

任何人都有更好/更聰明的解決方案?

非常感謝!

+0

這是一個很好的快速的方法。 –

+0

我同意,但只記得你需要在每個領域內的統一分配,否則你會得到「一堆網格」。 – Fredrik

回答

1

這裏我將盡....

因爲它是關於剪報我假設視覺部分也很重要...

我會劃分表中4個部分(在表面平等)和另外一個(重疊)部分代表表格的中心。你總是可以打4的數目,並使其成爲6或8,但我不會高達20個。

現在你將剪報在隨機x/y位置上分成5個部分。

就像這樣,你總是會有一個「強壯」的桌子中心,但是你保證並非所有的剪報都在一堆。

+0

非常感謝。將嘗試。 – zantafio

0

也許解決這個問題的最簡單的方法是將其平坦化爲線性對象。一個4 x 5的網格可以成爲20的列表。給每個'slot'一個數字(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 

注:該算法在多次迭代所有「插槽」提供均勻分佈。

0

這是一個非常簡單的蠻力方法:

  • 請您已經選擇了點的列表。
  • 挑個隨機點
  • 選擇其中有您的列表上的所有點的最大最小距離的點,扔掉別人
  • 點添加到您所選取的點的列表
  • 重複直到你有足夠的分數

基本上,你總是嘗試多個點,並選擇只有離所有先前選擇的點最遠的點。

運行時間是O(n²)