我正在尝试制作一个交易或不交易游戏,但我现在的问题是随机分配案例值。我没有运气随机生成一个数字并检查它是否已经存在,所以我现在试图简单地改组数组。问题是,由于某种原因,价值观会重复。 代码:
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
我需要每个值都是唯一的。我很确定我的代码中存在逻辑错误。任何有关数字重复原因的帮助都会很棒。
以下是几个输出:
第一个列表是案例编号,第二个列表是可能的值,第三个是最终结果 - 个别案例值。如您所见,有些是重复的,第一个列表重复两次.. 编辑:我发现为什么它重复了两次 - 我是愚蠢到留下另一个for循环,也是添加到列表中。我已经解决了我的问题,请看下面的答案。
答案 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)
每个元素生成一个随机数,然后通过这些键对原始数组进行就地排序。