3

我是堆栈溢出的新手,我正在学习一种新语言,即 vb.net。我正在开发第一个需要使用数据库的应用程序,而我正在尝试做的是获取列中的每个条目,将它们放入一个数组中,对数组进行混洗,然后将新数组放回数据库的列。帽子应用程序中的名称排序..我现在没有任何代码,我先做我的课程,我搜索了很多论坛,我已经有很多难题,比如随机数组,数据库处理。 .我的问题是我没有找到任何代码来阻止数据在洗牌后获得相同的顺序,例如:

假设我的数据库中有 4 个条目:Sarah、james、alex、daniel。

在对数组进行排序时,我怎样才能防止 sarah 排在第一位,或者 james 排在第二位,等等。

如果你能给我一点开始.. 正如我告诉你的那样,我开始学习这门语言,我不希望你们为我编写应用程序,但只要有一点线索就会非常感激。我在网上查看课程,但我对初学者课程和“hello world”第一个应用程序演示有点厌倦了……我想我已经准备好进行下一步了!

4

4 回答 4

0

首先,为什么初始订单是无效的洗牌?

撇开这一点不谈,最简单的方法是克隆您的原始列表和元素,将其与您的函数结果进行比较,并保持随机化,直到它不是。更好地检查 0 或 1 个元素列表,否则您将获得无限循环。

于 2012-12-02T07:02:57.850 回答
0

在符合 SQL 的数据库中,表中行的物理顺序应该在很大程度上无关紧要,因为当您从中选择数据时,您可以对任何内容进行排序(SQL Server 中的物理顺序由聚集索引确定/设置) )。因此,在您希望将排序顺序保存到数据库的情况下,我建议您添加一个额外的列来存储每行的排序索引。

因此,例如,当按字母顺序排序时,数据将如下所示:

Name     SortIndex
------   ---------
Sarah    3
James    2
Alex     0
Daniel   1

当洗牌时,物理顺序不会改变,但排序索引会,例如:

Name     SortIndex
------   ---------
Sarah    2
James    0
Alex     1
Daniel   3
于 2012-12-02T12:52:31.773 回答
0

@Steven 得到了一个有效的观点。但我认为您甚至可以不添加SortIndex,因为您可以直接在查询中随机播放结果,如下所示(假设您的后端是 MSSQL):

SELECT * FROM table1 ORDER BY NEWID()

如果仍然需要,可以通过以下方式以编程方式对数组进行混洗:

Dim a() As String = {"Sarah", "James", "Alex", "Daniel"}
Dim shuffledList As New List(Of String)
Randomize()
For i = 0 To UBound(a)
  Dim allowedValues() As String = a.Except(shuffledList).ToArray
  shuffledList.Add(allowedValues(Math.Floor(Rnd() * allowedValues.Count)))
Next

如果要确保任何元素不重复原始顺序,请改用以下代码:

Dim a() As String = {"Sarah", "James", "Alex", "Daniel"}
Dim ub As Integer = UBound(a)
Dim shuffledList As New List(Of String)
Randomize()
For i = 0 To ub
  Dim allowedValues() As String = a.Except(shuffledList).Except({a(i)}).ToArray
  Dim randomValue As String
  If i = ub - 1 And allowedValues.Contains(a(ub)) Then
    randomValue = a(ub)
  Else
    randomValue = allowedValues(Math.Floor(Rnd() * allowedValues.Count))
  End If
  shuffledList.Add(randomValue)
Next

这里最重要的部分是如果最后一个项目尚未被拾取,则最后一个项目之前的项目被强制成为最后一个项目。这是为了确保最后一个项目除了最后一个位置之外的某个地方,否则在最后一步中没有任何东西可以选择。总体而言,序列似乎是随机排序的,并且可以保证项目#1 不会是#1,#2 不会是#2 等等。算法总是以 N 步结束,其中 N 是项目数。

于 2012-12-02T15:08:15.960 回答
0

感谢您的回答。我已经用另一种语言编写了该脚本,实现它的方式非常简单:

取同一个数组:Sarah、James、Alex、Daniel;

我会复制数组;

然后第一个数组中的每个条目都会在第二个数组中选择一个随机条目;莎拉会先走——如果她选择了自己的名字,取消它然后再次选择,直到她选择另一个名字;

然后从第二个数组中退出选择的名称;

然后用第二个名字重复每一步,第三个......

当然,所有这些都是通过循环完成的。

也许这一切都可以在 vb.net 中非常简单地实现,但我很确定(不知道很多)在 vb.net 中没有“Ramdomize.PreventSameSortIndexOrder”类型的函数;)。我理解 Steven 演示的内容,但您能解释一下如何防止索引 ID 在混洗后回到同一个地方吗?我正在学习使用 VB 处理 MS Access 数据库,但如果 SQL 由于某种原因更好,那么切换不会有问题。@Neolisk 你能告诉我更多关于你写的这个命令的信息吗:

SELECT * FROM table1 ORDER BY NEWID()

谢谢大家!

于 2012-12-02T17:16:53.837 回答