如何在VBscript中混洗二维数组?

时间:2014-08-18 14:44:53

标签: sql arrays vbscript asp-classic shuffle

我需要在vbscript中对一个二维数组进行洗牌,有人告诉我可以在sql查询中使用newid(),但是我没有使用sql server。 我在网上看到了关于LBoundUBound的一些内容,但并不是很了解。 有人可以帮助我理解或告诉我最好的方法吗? 提前致谢。到目前为止,这是我的代码。

sql = "SELECT * FROM Questions"

recordset.Open sql, connection

If Not recordset.EOF Then
    nQuestions = recordset.RecordCount
    questions = recordset.GetRows(nQuestions, 0)
    If IsArray(questions) Then
    (...)
    End If
End If

1 个答案:

答案 0 :(得分:1)

回答与UBoundLBound相关的部分问题:

LBoundUBound是数组的下限和上限。您可以指定两个参数,即数组名称和要计数的维度,例如:

Dim myArr(10, 8)
Dim firstDim, secondDim
firstDim = UBound(myArr, 1)  ' The 1 here requests the size of the first dimension of the array
secondDim = UBound(myArr, 2) '... and this, the second.

此处,firstDim将保持数组第一维的大小(即10),secondDim保持第二维(即8)。

显然LBound适用于最低维度,但实际上只用于基数不是通常为零的数组(可能来自COM对象)。

- 编辑 -

为了进一步扩展,你可以使用Access中的一个函数来解决这个问题,但它确实会大大减慢这个过程。

您需要创建一个查询来选择您的数据。选择包含您问题的表格。将问题所需的所有列拖放到底部的网格中。在网格类型最右侧列的Field框中,类似于:

randomiser: Rnd([questionId])

(显然questionId是问题的唯一ID。)

这将为您提供最后一列中随机数(从0到1)的问题列表。现在将此列的排序顺序更改为Ascending,您还可以在查询中添加TOP子句,以便为您提供特定数量的问题。

因为为Rnd函数中的每一行指定了一个参数,所以每次都必须执行该参数,这与简单地放置Rnd()不同。另请注意,如果您运行查询并单击其中一个随机字段,则数字会更改。

这里要记住的一件事是,如果其中一个字段中有一个空(NULL)值,则排序将失败。