我正在研究一個應用程序,在這個應用程序中,大量的剪報應該在y桌面上隨機「拋出」。然而,如果使用真正的隨機數,那麼總是有可能所有的剪輯出現在一個地方。 客戶會更喜歡更「平等」的隨機分配。尋找一個好的算法來平均分配
我的一個解決方案是: 如果我有20個剪報,計算一個有20個字段的網格,然後將每個剪輯放在該字段中隨機x/y位置的字段中。
任何人都有更好/更聰明的解決方案?
非常感謝!
我正在研究一個應用程序,在這個應用程序中,大量的剪報應該在y桌面上隨機「拋出」。然而,如果使用真正的隨機數,那麼總是有可能所有的剪輯出現在一個地方。 客戶會更喜歡更「平等」的隨機分配。尋找一個好的算法來平均分配
我的一個解決方案是: 如果我有20個剪報,計算一個有20個字段的網格,然後將每個剪輯放在該字段中隨機x/y位置的字段中。
任何人都有更好/更聰明的解決方案?
非常感謝!
你在找什麼被稱爲準隨機序列(或低差異序列)。有幾個這樣的知名序列,這裏是Wikipedia entry。根據您所選擇的語言,可以使用隨時可用的庫(在此問題中提到了幾個示例:Recommendations for Low Discrepancy (e.g. Sobol) quasi-random sequences in Python/SciPy?)。
好的,謝謝你會看看,看起來非常完美。現在我知道它是如何被調用的。 – zantafio
這裏我將盡....
因爲它是關於剪報我假設視覺部分也很重要...
我會劃分表中4個部分(在表面平等)和另外一個(重疊)部分代表表格的中心。你總是可以打4的數目,並使其成爲6或8,但我不會高達20個。
現在你將剪報在隨機x/y位置上分成5個部分。
就像這樣,你總是會有一個「強壯」的桌子中心,但是你保證並非所有的剪報都在一堆。
非常感謝。將嘗試。 – zantafio
也許解決這個問題的最簡單的方法是將其平坦化爲線性對象。一個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())) + " ");
}
}
該算法通過以下方式:
很明顯,只是打印出來的數字不會很好,所以根據需要修改代碼。
一個例子輸出可能是:
15 9 17 13 8 10 6 11 3 7 2 19 4 0 12 18 16 5 1 14
注:該算法在多次迭代所有「插槽」提供均勻分佈。
這是一個非常簡單的蠻力方法:
基本上,你總是嘗試多個點,並選擇只有離所有先前選擇的點最遠的點。
運行時間是O(n²)
這是一個很好的快速的方法。 –
我同意,但只記得你需要在每個領域內的統一分配,否則你會得到「一堆網格」。 – Fredrik