0

我正在尝试对多维数组进行排序,但不确定这是否是正确的方法。到目前为止,我在多维数组中获取了我的 5 个数字,然后将它们移动到一维数组中并使用数组排序。知道更好的方法吗?或者对如何改进我的有想法?此外,代码目前在排序区域中不起作用,它给了我一个数组错误的索引。

任何帮助将不胜感激。提前致谢

Module q
    Sub Main()
        Randomize()
        Dim Player,RandomNumber,NumberOfPlayers,Index As Integer
        Dim Roll as Integer = 0
        Console.Write("How many people will be playing Yahtzed?: ")
        Player = convert.toint32(Console.Readline)
        NumberOfPlayers = Player
        Dim Game(Player,5) As Integer
        Do until Player = 0
            Console.Write("User")
            Roll = 0
            Do until Roll = 5
                RandomNumber = CINT(Int((6 * Rnd()) + 1))
                Game(Player,Roll) = RandomNumber
                Roll += 1
                Console.Write(" "&RandomNumber)
            Loop 
            Player -= 1
            Console.Writeline()
        Loop 
        Player = NumberOfPlayers
        Do until Player = 0
            Dim Ordering(5) as Integer
            Roll = 0
            Do until Roll = 5
                Ordering(Index) = Game(Player,Roll)
                Roll += 1
                Index += 1
                Array.Sort(Ordering)
            Loop
        Loop
    End Sub
End Module
4

2 回答 2

0

迭代数组的惯用方式是使用 For 语句完成的

Const  NPlayers As Integer = 5, NRolls As Integer = 5

Dim game = New Integer(NPlayers - 1, NRolls - 1) {}
Dim randomizer As New Random()
Dim randomNumber As Integer

For p As Integer = NPlayers - 1 To 0 Step -1
    For r As Integer = 0 To NRolls - 1
        randomNumber = randomizer.[Next](10)
        game(p, r) = randomNumber
    Next 
Next

数组索引总是从0arraysize-1

您的 Ordering 数组的大小为NPlayers * NRolls

Dim Ordering(NPlayers * NRolls - 1) As Integer

你的太短了。因此你得到一个例外。


可以使用Random类创建整数随机数

Dim randomizer As New Random()
Dim randomNumber As Integer

...

randomNumber = randomizer.[Next](10)

这将创建 0 到 10 之间的随机数。仅创建一次随机发生器,然后通过调用该Next方法获取下一个随机数。

(您必须将Next方法放在方括号中,因为NextVB 中是关键字。)


更新

我假设您想对每个玩家的卷进行排序。实现这一点的最简单方法是改用锯齿状数组。

Const  NPlayers As Integer = 5, NRolls As Integer = 5

Dim game = New Integer(NPlayers - 1)() {}
For p As Integer = NPlayers - 1 To 0 Step -1
    game(p) = New Integer(NRolls - 1) {}
    For r As Integer = 0 To NRolls - 1
        game(p)(r) = randomizer.[Next]()
    Next
    Array.Sort(game(p))
Next

但是您将不得不使用game(p)(r)而不是访问卷game(p,r)

于 2012-10-18T18:47:43.920 回答
0

我敢打赌,如果你把它画出来,它真的会对你有帮助。一维数组和多维数组之间没有真正的区别,这纯粹是你自己的思考过程。考虑一个由 5 个骰子组成的网格的 5x3 阵列。我们可以通过两种方式组织它:

作为二维:数组开始 -> 卷 1 -> 1 2 3 4 5 卷 2 -> 2 4 2 1 5 卷 3 -> 2 5 4 3 2

或者作为一维:数组的开始 -> 1 2 3 4 5 2 4 2 1 5 2 5 4 3 2

无论哪种方式,您都必须任意确定如何划分内存块。在二维情况下,您预先标记第一个数组索引基本上说“每个第二维将包含 5 个整数”。在内存中,您会弄清楚自己的位置: memory_address = offset 以到达数组的内存空间 + [1st_Dim]*sizeof(5 integers) + [2nd_Dim]*sizeof(integer)

一维情况是这样做的:memory_address = offset to get to your array's memory space + [1st_Dim]*sizeof(integer)

只要您小心知道您在正确的索引处,这两个地址将是相同的。

把它画在纸上并运行你的索引,它会帮助你理解你正在迭代的内容。

于 2012-10-18T18:55:30.397 回答