以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  随机抽取的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=107331)

--  作者:douglas738888
--  发布时间:2017/9/26 9:39:00
--  随机抽取的问题

请教老师,下面代码根据帮助上洗牌抽取,

 

想实现的是,例如,第一次随机抽取了其中的10行,第二次再随机抽取10行,但是第二次随机抽取的10行中包含第一次抽取中的5行

 

目前第一次抽取的行比较相邻排序,99,82,76,61,50,48,33,25,10 怎样能再分开一些,目前有1000多行

 

第一次       第二次

11              22

12              67

15              56

19              11

18              20

13              71

16              15

14              49

20              13

22              99

 

 

Dim cnt As Integer = DataTables("表C").DataRows.Count

Dim ids1 As New List(of Integer) \'用于存储洗牌前的位置

Dim ids2 As New List(of Integer) \'用于存储洗牌后的位置

For i As Integer = 0 To cnt -1 \'准备初始的牌

    ids1.add(i)

Next

For i As Integer = 0 To cnt - 1 \'开始洗牌

    ids2.Add(ids1(rand.Next(0,ids1.count)))

Next

Tables("表C").StopRedraw()

DataTables("表C").ReplaceFor("选择",False)

For i As Integer = 0 To 10 - 1 \'10为要抽取的行数

    DataTables("表C").DataRows(ids2(i))("选择") = True

Next

Tables("表C").Filter = "[选择] = True"

Tables("表C").ResumeRedraw()

[此贴子已经被作者于2017/9/26 10:06:47编辑过]

--  作者:有点甜
--  发布时间:2017/9/26 10:10:00
--  

帮助文档洗牌有问题,换一种方式

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=86672&skin=0

 

你控制好洗牌次数(越多越好),就可以洗得很乱了;再有就是选取数据的时候,你不一定是从上往下选取10行嘛,选取数据的时候,你还能再随机选10个。


--  作者:douglas738888
--  发布时间:2017/9/26 12:19:00
--  

老师,第一个问题,output出来的行与“选择”出来的行不一样 ,output显示出来的数字是行号还是???

 

第二个问题,如何在第二次以后的洗牌与抽取中均包含上一次随机出现的50%的行,相当于第二次随机抽取的10行中包含上一次已经出现的5行

 

下面代码在命令窗口测试的  数据在表C

Dim dt As DataTable = DataTables("表C")
Dim cnt As Integer = dt.DataRows.Count
Dim ids(cnt - 1) As Integer
For i As Integer = 0 To cnt - 1
    ids(i) = i
Next
For i As Integer = 0 To cnt \\ 3 \'洗牌次数
    Dim id1 As Integer = rand.Next(100,cnt)
    Dim id2 As Integer = rand.Next(100,cnt)
    Dim vid As Integer = ids(id1)
    ids(id1) = ids(id2)
    ids(id2) = vid
Next
dt.StopRedraw()
DataTables("表C").ReplaceFor("选择",False)
For i As Integer = 300 To 309 \'-1
    output.show(ids(i))
DataTables("表C").DataRows(ids(i))("选择") = True
Next
Tables("表C").Filter = "[选择] = True"
dt.ResumeRedraw()

 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:随机洗牌.table

[此贴子已经被作者于2017/9/26 14:13:16编辑过]

--  作者:有点甜
--  发布时间:2017/9/26 14:37:00
--  

1、ids存放的是行号,不是你的指标列的数据;

 

2、红色代码表示上次的行号,请自行用全局变量存放其值

 

Dim pids() As String = "1,3,5,9,10,12,20,15,16,17".split(",")

Dim dt As DataTable = DataTables("表C")
Dim cnt As Integer = dt.DataRows.Count
Dim ids(cnt - 1) As Integer
For i As Integer = 0 To cnt - 1
    ids(i) = i
Next
For i As Integer = 0 To cnt \\ 3 \'洗牌次数
    Dim id1 As Integer = rand.Next(100,cnt)
    Dim id2 As Integer = rand.Next(100,cnt)
    Dim vid As Integer = ids(id1)
    ids(id1) = ids(id2)
    ids(id2) = vid
Next
dt.StopRedraw()
DataTables("表C").ReplaceFor("选择",False)
Dim count As Integer = 0

Do While count < 5
    Dim rnd As Integer = Rand.Next(0, 10)
    If DataTables("表C").DataRows(pids(rnd))("选择") = False Then
        count += 1
        DataTables("表C").DataRows(pids(rnd))("选择") = True
    End If
Loop

Do While count < 10
    Dim rnd As Integer = Rand.Next(0, cnt)
    If DataTables("表C").DataRows(ids(rnd))("选择") = False Then
        count += 1
        DataTables("表C").DataRows(ids(rnd))("选择") = True
    End If
Loop
Tables("表C").Filter = "[选择] = True"
dt.ResumeRedraw()

 


--  作者:douglas738888
--  发布时间:2017/9/26 16:35:00
--  

老师,我对全局代码不是很熟悉,我在全局代码中这样写对吗 还是写VAR

 

Public pids() As String = "1,3,5,9,10,12,20,15,16,17".split(",")

 

另外,这段代码的是存原来5行的内容,是吗,如果上面的代码调整为抽取20行,是否在"1,3,5,9,10,12,20,15,16,17",任意添加行号就可以了

Do While count < 5 \'改成10也抽取10行,另外<10 的那段代码,改成5也是5行????
    Dim rnd As Integer = Rand.Next(0, 10)
    If DataTables("表C").DataRows(pids(rnd))("选择") = False Then
        count += 1
        DataTables("表C").DataRows(pids(rnd))("选择") = True
    End If
Loop

 

 

[此贴子已经被作者于2017/9/26 16:38:35编辑过]

--  作者:有点甜
--  发布时间:2017/9/26 17:59:00
--  

全局代码

 

public pstr As String = ""

 

按钮代码

 

Dim pids() As String = pstr.split(",")
Dim num As Integer = 20
pstr = ""

Dim dt As DataTable = DataTables("表C")
Dim cnt As Integer = dt.DataRows.Count
Dim ids(cnt - 1) As Integer
For i As Integer = 0 To cnt - 1
    ids(i) = i
Next
For i As Integer = 0 To cnt \\ 3 \'洗牌次数
    Dim id1 As Integer = rand.Next(0,cnt)
    Dim id2 As Integer = rand.Next(0,cnt)
    Dim vid As Integer = ids(id1)
    ids(id1) = ids(id2)
    ids(id2) = vid
Next
dt.StopRedraw()
DataTables("表C").ReplaceFor("选择",False)
Dim count As Integer = 0

If pids.length >= num / 2
    Do While count < num / 2
        Dim rnd As Integer = Rand.Next(0, pids.length)
        If DataTables("表C").DataRows(pids(rnd))("选择") = False Then
            count += 1
            DataTables("表C").DataRows(pids(rnd))("选择") = True
            pstr &= pids(rnd) & ","
        End If
    Loop
End If
Do While count < num
    Dim rnd As Integer = Rand.Next(0, cnt)
    If DataTables("表C").DataRows(ids(rnd))("选择") = False Then
        count += 1
        DataTables("表C").DataRows(ids(rnd))("选择") = True
        pstr &= ids(rnd) & ","
    End If
Loop
Tables("表C").Filter = "[选择] = True"
dt.ResumeRedraw()
pstr = pstr.trim(",")
msgbox(pstr)