簡體   English   中英

將序列片段化為最大隨機性(數組,任何語言)

[英]Fragmenting the sequence to a maximum randomness (arrays, any language)

我和我的好開發者朋友進行了有趣的討論。 我想創建一個給定數組值的隨機序列,但具有最大的碎片,沒有任何可檢測的模式。 對於任何唯一序列,所謂的最大隨機性實際上總是相同的。

輸入數組示例:

array(1, 2, 3, 4, 5);

標准rand()函數的示例結果:

array(2, 3, 1, 5, 4);

我在上面的輸出中不喜歡的是像“ 2,3”和“ 5,4”這樣的序列值,它的碎片還不夠。

預期結果將/可能是:

array(3, 5, 1, 4, 2);

所以我的問題; 有沒有已知的公式可以計算最大隨機性,或者為了更好地選擇單詞,可以使用最大碎片度?

所以,您在說的是排序,而不是隨機化。 隨機化的結果不應取決於初始數據的順序。

在這種情況下,通過分段,有必要了解排序前后數組之間的差異。 但是必須根據任務對它進行不同的評估。 例如,可以評估元素位置或其順序之間的差異。

排序示例。

    <?
// it must be uksort() function with sequence formula, but for me easier do like this
    $array = array(1, 2, 3, 4, 5);
    uk_sort($array);
    function uk_sort(&$array) {
        for($i=0;$i<count($array);$i++) {
            if($i%2==0) {
                $even[] = $array[$i];
            } else {
                $odd[] = $array[$i];
            }
        }
        $even[] = array_shift($even);
        rsort($odd);
        $array = array_merge($even, $odd);
    }
    print_r($array);
    ?>
Array
(
    [0] => 3
    [1] => 5
    [2] => 1
    [3] => 4
    [4] => 2
)

您可以將列表分為兩個(或更多)集合,將它們混洗然后按順序混合?

array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

array(1, 2, 3, 4, 5);
array(6, 7, 8, 9, 10);

array(2, 3, 1, 5, 4);
array(8, 7, 10, 9, 6);

array(2, 8, 3, 7, 1, 10, 5, 9, 4, 6)

這會給您帶來很高的碎片,但不會達到最大碎片。 我懷疑要獲得最大的回報將需要更多的工作。

我認為這聽起來像是一個旅行推銷員類型的問題,“距離”是兩個選定條目之間的差異,除了您的目標是最大化總距離而不是最小化總距離。

我實際上對該主題一無所知,但是我想這是我所知道的:

有一些針對旅行商問題的算法,但是在極限方面可能很慢(它們是NP-hard )。 另一方面,雖然它仍然是一個非平凡的算法,但有很好的近似值,並且簡單的情況也可以解決。

根據最大碎片化的重要性,您還可以嘗試一種朴素的方法:給定一個元素,選擇下一個元素,使其與給定元素相距甚遠。 然后選擇下一個元素,依此類推。 問題在於您的早期選擇會使您陷入困境。 因此,如果碎片對您而言非常重要,則此方法將無效。

[2,5,1,3,4] // the first three choices force us to not fragment the last two

假設碎片定義為連續值的絕對差之和,則最大碎片序列不是唯一的-反向序列將始終具有完全相同的碎片,並且有更多選擇,例如,以下所有順序將具有11的碎片,此數組的最大值:(3,1,5,2,4),(3,2,5,1,4),(2,5,1,4,3),(2 ,4,1,5,3),(4,1,5,2,3),(4,2,5,1,3),(3,5,1,4,2),(3,4 ,1,5,2)。 如果還合並了最后一個元素與第一個元素之間的差異,則還會有更多的對稱性。

如果要確定一個特定的最大片段序列,例如“沒有明顯的模式”,則必須將后者的概念形式化並進行搜索,我懷疑,從計算的角度來看,這將是昂貴的,除非可以對目標進行形式化以允許有效解碼。 我懷疑對於所有實際目的,良好的啟發式方法就足夠了,例如,將元素一個接一個地插入數組(貪婪的方式),以使每個步驟的片段化收益最大化。

但是,如果數組的元素不是數字,而是一些實體,每對具有定義的距離,則該問題的確等同於旅行商問題,如user802500所指出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM