2017-10-14 106 views
1

我試圖做一個交易或不交易的遊戲,但是我現在的問題是隨機爲案例分配設置值。我沒有隨機生成一個數字並檢查它是否已經存在,所以我現在試圖簡單地洗牌數組。問題是,出於某種原因,值重複。 代碼:VB:Random Shuffler Duplicating Values

Dim nCaseValues(26) As Integer 'The different possible values for a case 
    Dim nCaseNumbers(26) As Integer 'The different case numbers 

    Dim nShadowNumber As Integer 'This holds the first number in the shuffle 
    Dim nShuffleNumber1 As Integer 'The first random position 
    Dim nShuffleNumber2 As Integer 'The second random position 

    'Clear the list if it already has content 
    listArray1.Items.Clear() 
    listArray2.Items.Clear() 
    listArray3.Items.Clear() 

    'Declare array for case values 
    nCaseValues(0) = 1500 
    nCaseValues(1) = 1 
    nCaseValues(2) = 2 
    nCaseValues(3) = 5 
    nCaseValues(4) = 10 
    nCaseValues(5) = 20 
    nCaseValues(6) = 50 
    nCaseValues(7) = 100 
    nCaseValues(8) = 150 
    nCaseValues(9) = 200 
    nCaseValues(10) = 250 
    nCaseValues(11) = 500 
    nCaseValues(12) = 750 
    nCaseValues(13) = 1000 
    nCaseValues(14) = 2000 
    nCaseValues(15) = 3000 
    nCaseValues(16) = 4000 
    nCaseValues(17) = 5000 
    nCaseValues(18) = 10000 
    nCaseValues(19) = 15000 
    nCaseValues(20) = 20000 
    nCaseValues(21) = 30000 
    nCaseValues(22) = 50000 
    nCaseValues(23) = 75000 
    nCaseValues(24) = 100000 
    nCaseValues(25) = 200000 

    'Declare array for case numbers 
    For genCaseNumArray = 0 To 25 
     nCaseNumbers(genCaseNumArray) = 0 
     listArray1.Items.Add(genCaseNumArray) 
    Next 

'The shuffle 
    For J = 0 To 25 'This assigns case values to case numbers (It's probably moot, as I can just use the nCaseValues position, but it's here for now) 
     nCaseNumbers(J) = nCaseValues(J) 
    Next 
    For K = 0 To 25 'Lists the items below, this could possibly be an error 

     For I = 0 To 50 'Shuffles the list 50 times 
      nShuffleNumber1 = (Int(Rnd() * 26)) 'Gets a random number and assigns it 
      nShuffleNumber2 = (Int(Rnd() * 26))'Gets a random number and assigns it 
      nShadowNumber = nCaseNumbers(nShuffleNumber1) 'This holds the first value during the shuffle 
      nCaseNumbers(nShuffleNumber1) = nCaseNumbers(nShuffleNumber2)'First value now equals second value... 
      nCaseNumbers(nShuffleNumber2) = nShadowNumber 'And now second value holds first value. 

     Next 'Lists items in lists objects on the form 
     listArray1.Items.Add(K) 
     listArray2.Items.Add(nCaseValues(K)) 
     listArray3.Items.Add(nCaseNumbers(K)) 
    Next 

我需要每個值是唯一的。我很確定這是我的代碼中的邏輯錯誤。任何關於數字爲什麼重複的幫助都會很好。

這裏有一對夫婦的輸出:

Outcome #1 Outcome #2

第一清單的案件編號,二是爲了可能的值,第三個是最終的結局 - 個案價值。正如你所看到的,一些是重複的,第一個列表重複兩次..編輯:我發現它爲什麼重複兩次 - 我很愚蠢,留下另一個循環,這也是添加到列表中。我已經解決了我的問題,請參閱下面的答案。

+0

這只是不正確的方式來獲得隨機洗牌。你用一副52張牌做的方式是首先得到0到51之間的一個隨機數。取出相應的牌。接下來得到0到50之間的一個隨機數字,拿出卡片。接下來在0和49之間。等等,重複,直到甲板空了。 Google「vb.net fisher yates shuffle」,很多熱門歌曲。 –

回答

-1

我曾經推薦隨機化一個這樣的數組:

Dim rng As New Random 

myArray = myArray.OrderBy(Function(element) rng.NextDouble()).ToArray() 

此後,它一直向我指出,有與一個嚴重的問題,因爲它會產生多個相同的元素一個新的隨機數次,因此比較相同的兩個元素可以在不同的場合產生不同的結果。還有一個問題是它創建一個新的數組對象。下面克服了這兩個問題的那些:

Dim rng As New Random 
Dim keys = myArray.Select(Function(element) rng.NextDouble()).ToArray() 

Array.Sort(keys, myArray) 

即生成每一個元素的隨機數,然後通過排序這些密鑰就地原始數組。

+0

感謝您的答案 - 這是否會給數組的元素一個獨特的價值,但? – PlanetAlexander

+0

原始數組,即示例中的'myArray',仍然包含與它開頭的值相同的值,但它們將按隨機順序排列。 'keys'數組將包含隨機的'Double'值,它們都大於等於0.0且小於等於1.0。他們可能都是獨一無二的,但不一定如此。這個'keys'數組在Sort Sort調用之後被丟棄,因爲它不再是必需的。它純粹爲隨機化過程而存在。 – jmcilhinney

0

我想出了問題(好吧,更多的只是運氣) - 內部For循環應該不是的內部。我把它搬出去,瞧 - 它就像一個魅力一樣。至今。讓我們等待。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Randomize() 'Make the form random 

End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    'State Variables 
    Dim nCaseValues(26) As Integer 'The different possible values for a case 
    Dim nShadowNumber As Integer 
    Dim nShuffleNumber1 As Integer 
    Dim nShuffleNumber2 As Integer 

    'Clear the list if it already has content 
    listArray1.Items.Clear() 
    listArray2.Items.Clear() 
    listArray3.Items.Clear() 

    'Declare array for case values 
    nCaseValues(0) = 1500 'If you're wondering why this is here, it's because I couldn't be bothered to work with a "car" value. 
    nCaseValues(1) = 1 
    nCaseValues(2) = 2 
    nCaseValues(3) = 5 
    nCaseValues(4) = 10 
    nCaseValues(5) = 20 
    nCaseValues(6) = 50 
    nCaseValues(7) = 100 
    nCaseValues(8) = 150 
    nCaseValues(9) = 200 
    nCaseValues(10) = 250 
    nCaseValues(11) = 500 
    nCaseValues(12) = 750 
    nCaseValues(13) = 1000 
    nCaseValues(14) = 2000 
    nCaseValues(15) = 3000 
    nCaseValues(16) = 4000 
    nCaseValues(17) = 5000 
    nCaseValues(18) = 10000 
    nCaseValues(19) = 15000 
    nCaseValues(20) = 20000 
    nCaseValues(21) = 30000 
    nCaseValues(22) = 50000 
    nCaseValues(23) = 75000 
    nCaseValues(24) = 100000 
    nCaseValues(25) = 200000 

    'Declare array for case numbers, probably obsolete 
    For genCaseNumArray = 0 To 25 
     nCaseNumbers(genCaseNumArray) = 0 
    Next 

    For J = 0 To 25 'Assigning case values to case numbers 
     nCaseNumbers(J) = nCaseValues(J) 
    Next 

    For I = 0 To 26 'The main shuffle. 
     nShuffleNumber1 = (Int(Rnd() * 26)) 'This selects a random number between 0 and 25, somehow. 
     nShuffleNumber2 = (Int(Rnd() * 26)) 'Ditto 
     nShadowNumber = nCaseNumbers(nShuffleNumber1) 'This "Shadow Number" will be used to temporarily hold the value of the first case 
     nCaseNumbers(nShuffleNumber1) = nCaseNumbers(nShuffleNumber2) 'The value of the first case now equals the value of the second case... 
     nCaseNumbers(nShuffleNumber2) = nShadowNumber '... and vice versa. 

    Next 'Display the cases, case values and shuffled case values in the lists. 
    For K = 0 To 25 
     listArray1.Items.Add(K) 
     listArray2.Items.Add(nCaseValues(K)) 
     listArray3.Items.Add(nCaseNumbers(K)) 
    Next 

我發現這是一個非常簡單的和(也許)洗牌陣列的有效方式。比爲MERN編寫腳本要容易得多。