Foxtable(狐表)用户栏目专家坐堂 → 如何产生不重复的随机数


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

主题:如何产生不重复的随机数

帅哥哟,离线,有人找我吗?
明天的灵
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:371 积分:4374 威望:0 精华:0 注册:2017/2/7 7:41:00
如何产生不重复的随机数  发帖心情 Post By:2018/11/20 14:15:00 [只看该作者]

从产生000~999之间产生300个不重复的随机数,过程显示在文本框中,并存入表C的第一列。

DataTables("表C").DeleteFor("")
Dim i As Integer
Dim tt As  Boolean  '判断是否重复随机楼
Dim txt As WinForm.TextBox = e.Form.Controls("TextBox1")

Tables("表C").StopRedraw
For i = 1 To 300
    Dim r As Row= Tables("表C").AddNew
    Do                  '循环,至少一次
        Dim Val As String = Rand.Next(1000) '生成0到999之间的随机整数
        Dim s As String = val.PadLeft(3, "0")
        Dim dr As DataRow
        dr =DataTables("表C").Find("第一列 = '& s &'")
        If dr IsNot Nothing Then '如果找到的话
            '重新求随机数
            tt = True
        Else
            txt.Text = s   '文本框显示随机数
            r("第一列") = s
            tt = False  '找到不重复的随机数,DO循环结束
        End If
    Loop While tt
Next
Tables("表C").ResumeRedraw


以上语句会产生死循环,可能大量时间浪费在查找不重复的随机数上,而且在随机数产生过程中,文本框也没跟着变化,请问下,如何改进?

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


[此贴子已经被作者于2018/11/20 14:22:44编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/11/20 14:38:00 [只看该作者]

换一种思路,如

 

Dim dt As DataTable = DataTables("表C")
dt.DeleteFor("")
Dim cnt As Integer = 999
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*2  '洗牌次数
    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()
Dim ks As Integer = Rand.Next(1000-300)
For i As Integer = 1 To 300
    Dim dr = dt.addnew
    dr("第一列")=ids(i+ks-1)
Next
dt.ResumeRedraw()

[此贴子已经被作者于2018/11/21 9:14:48编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
明天的灵
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:371 积分:4374 威望:0 精华:0 注册:2017/2/7 7:41:00
  发帖心情 Post By:2018/11/20 15:05:00 [只看该作者]

谢谢甜版主,结果对的,可惜看不懂后面二段代码
[此贴子已经被作者于2018/11/20 15:14:17编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/11/20 18:02:00 [只看该作者]

以下是引用明天的灵在2018/11/20 15:05:00的发言:
谢谢甜版主,结果对的,可惜看不懂后面二段代码
[此贴子已经被作者于2018/11/20 15:14:17编辑过]

 

1、把0-999的数值取出来,存放起来;

 

2、开始洗牌:随机交互两个位置的数字,交换任意次数,打乱数字;

 

3、取出任意一个位置的300个数字。


 回到顶部
帅哥哟,离线,有人找我吗?
明天的灵
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:371 积分:4374 威望:0 精华:0 注册:2017/2/7 7:41:00
  发帖心情 Post By:2018/11/20 21:19:00 [只看该作者]

哦,这么一说终于理解了,非常感谢!特别是洗牌时,二个任意位置对调,而且第三步,用任意位置去得到任意数,都很巧!
[此贴子已经被作者于2018/11/20 21:23:09编辑过]

 回到顶部