Foxtable(狐表)用户栏目专家坐堂 → 高效随机抽取少量和大量记录的方法


  共有4328人关注过本帖树形打印复制链接

主题:高效随机抽取少量和大量记录的方法

帅哥哟,离线,有人找我吗?
狐狸爸爸
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2015/5/15 8:59:00 [只看该作者]

这才是机会均等洗牌法:

 

Dim cnt As Integer = DataTables("订单").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("订单").StopRedraw()
DataTables("订单").ReplaceFor("选择",False)
For i As Integer = 0 To 100 - 1 '100为要抽取的行数
    DataTables("订单").DataRows(ids2(i))("选择") = True
Next
Tables("订单").Filter = "[选择] = True"
Tables("订单").ResumeRedraw()

 

 

[此贴子已经被作者于2015/5/15 10:40:41编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
jspta
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1731 积分:11255 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2015/5/15 9:02:00 [只看该作者]

rand这个随机函数一点都不随机,中间值出现概率远大于两头

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  13楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2015/5/15 10:29:00 [只看该作者]

以下是引用jspta在2015/5/15 9:02:00的发言:
rand这个随机函数一点都不随机,中间值出现概率远大于两头

 

专门测试了一下,不存在这个问题:

 

Dim cnt(9) As Integer
For i As Integer = 1 To 100000
    Dim n As Integer = rand.Next(0,100000) \ 10000
    cnt(n) = cnt(n) + 1
Next
For i As Integer = 0 To 9
    output.show(i & ":" & cnt(i))
Next

[此贴子已经被作者于2015/5/15 10:37:13编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
jspta
  14楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1731 积分:11255 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2015/5/15 13:13:00 [只看该作者]

以下是引用狐狸爸爸在2015/5/15 10:29:00的发言:

 

专门测试了一下,不存在这个问题:

 

Dim cnt(9) As Integer
For i As Integer = 1 To 100000
    Dim n As Integer = rand.Next(0,100000) \ 10000
    cnt(n) = cnt(n) + 1
Next
For i As Integer = 0 To 9
    output.show(i & ":" & cnt(i))
Next

你这样巨量下,测试当然会趋于平稳,但是几百几千的随机,很容易发现问题。


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2015/5/15 14:00:00 [只看该作者]

概率这东西,当然需要一定的量,才有说服力的。

 

当然你改为1000个,也会发现其实是没有规律的,也是匀分的:

 

Dim cnt(9) As Integer
For i As Integer = 1 To 1000
    Dim n As Integer = rand.Next(0,1000) \ 100
    cnt(n) = cnt(n) + 1
Next
For i As Integer = 0 To 9
    output.show(i & ":" & cnt(i))
Next


 回到顶部
帅哥哟,离线,有人找我吗?
jiskin
  16楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:713 积分:5196 威望:0 精华:0 注册:2012/4/13 13:10:00
  发帖心情 Post By:2015/5/15 14:00:00 [只看该作者]

用SQL直接抽不是更快更简单吗?

 回到顶部
帅哥哟,离线,有人找我吗?
jspta
  17楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1731 积分:11255 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2015/5/15 16:10:00 [只看该作者]

以下是引用jiskin在2015/5/15 14:00:00的发言:
用SQL直接抽不是更快更简单吗?
如何抽?求SQL语句


 回到顶部
帅哥哟,离线,有人找我吗?
逛逛
  18楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:1693 积分:12123 威望:0 精华:7 注册:2013/7/11 10:52:00
  发帖心情 Post By:2015/5/15 16:19:00 [只看该作者]

一个代码一天改5次

标准的完美主义

俺得好好学习

 

 

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
逛逛
  19楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:1693 积分:12123 威望:0 精华:7 注册:2013/7/11 10:52:00
  发帖心情 Post By:2015/5/15 16:21:00 [只看该作者]

以下是引用jspta在2015/5/15 16:10:00的发言:
如何抽?求SQL语句

网上有用NewID() 排序抽取的(MSSQL)


 回到顶部
帅哥哟,离线,有人找我吗?
supwork
  20楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:688 积分:4903 威望:0 精华:0 注册:2013/10/27 17:14:00
  发帖心情 Post By:2015/9/19 13:56:00 [只看该作者]

精神可佳,但到最后还是没多大用
你们测试速度了没有,光公平但速度太慢慢,想抽谁就抽谁.除非是一次性抽奖
但事实上的抽奖都是要快速滚动,按暂停才确定的
必须速度飞快才行,公平倒不是问题

 回到顶部
总数 24 上一页 1 2 3 下一页