VB:随机随机播放器复制值

时间:2017-10-14 05:11:15

标签: vb.net visual-studio

我正在尝试制作一个交易或不交易游戏,但我现在的问题是随机分配案例值。我没有运气随机生成一个数字并检查它是否已经存在,所以我现在试图简单地改组数组。问题是,由于某种原因,价值观会重复。 代码:

 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

第一个列表是案例编号,第二个列表是可能的值,第三个是最终结果 - 个别案例值。如您所见,有些是重复的,第一个列表重复两次.. 编辑:我发现为什么它重复了两次 - 我是愚蠢到留下另一个for循环,也是添加到列表中。我已经解决了我的问题,请看下面的答案。

2 个答案:

答案 0 :(得分: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编写脚本容易得多。

答案 1 :(得分:-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)

每个元素生成一个随机数,然后通过这些键对原始数组进行就地排序。