产生随机数据的概率问题,大家有什么更好的经验。

billy36 2004-01-04 01:26:36
想法是通过产生一个随机的数字然后看看数据库中对应这个随机数字是否已经使用如果已经使用则再循环再产生随机直到找到一个还没有使用的数字然后写入数据库使用这个数字。但是现在有一个问题我不能确定应该设定多少循环了就是FOR从开始到那里结束的问题。因为我不知道这个随机数产生的概率如何分布起码只是循环一遍是肯定不能全部随机一遍的我测试了一下。那么加两倍(就是下面代码里的to big*2)又怎么样基本上可以说全部随机一遍那多了呢,不好说。请问谁有这方面的资料或者怎么能更好的解决这个问题呢。
small和big是前面取得的两个范围比如1-10

for i=small to big*2
Randomize
sjksh=INT((big-small+1)*RND+small) //取得一个随机数sjksh
Sql = "Select * From xxbmht where bmh = "&sjksh&""
0rs.Open Sql,conn,1,1
kf=rs("kf")
xqbmh=rs("xqbmh")
rs.close //取得这个随机数所在数据库中的使用情况。
if kf=1 then
if xqbmh=0 then
xxbmh=sjksh
Set rsyyg=server.CreateObject("ADODB.recordset")
Sqlyyg = "update xxbmht set kf = 0 , xqbmh='"&bmxh&"' where bmh = "&xxbmh&" "
rsyyg.Open Sqlyyg,conn,3,3
exit for //如果证实没有使用那么写入正式使用的数据库
end if
end if
next //完成循环


这个是1-5的测试数据。

序列号:1
随机考试号:30005

序列号:2
随机考试号:30003

序列号:3
随机考试号:30001

序列号:4
随机考试号:30002

序列号:5
随机考试号:30001

序列号:6
随机考试号:30004

序列号:7
随机考试号:30001

序列号:8
随机考试号:30002

序列号:9
随机考试号:30001

序列号:10
随机考试号:30002


...全文
75 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ricky460 2004-01-05
  • 打赏
  • 举报
回复
假如开放5个考试号,5001,5003,6001,6005,6004 ;
先定义一个数组 。。(我用的是js)
var opened = new Array();
opened[0] = new Array(5001,0);//5001表示考试号,0表示是否已经被取出来。。。
opened[1] = new Array(5003,0);
opened[2] = new Array(6001,0);
opened[3] = new Array(6005,0);
opened[4] = new Array(6004,0);
var readed = 0 ;//已经抽取过的个数。。。
然后随机产生一个从0~4之间的数,存放在curRandom 。 。
if(readed >= 5)
{
如果已经读取超过了5个记录 , 表示所有记录已经读取完了。。
提示用户: 开放的考试号已经用完。。
}
else
{
if(opened[curRandom][1] == 1)
{
这条记录已经被读取过,重新产生一个随机数。。
}
else
{
opened[curRandom][1] = 1 ;//将这个值赋值为1,表示已经读取过了。。
readed ++ ;//已经读取过的记录总数加一。。
var id = opened[curRandom][0] ;
//取出考试号,在数据库里面比较。看数据库里面有没有这个id号。。。。
//如果没有的话,做其他的操作。。
}
}

然后在最外面加一个while来一直循环,直到readed>=5触发跳出循环为止。。。
xiaoyuehen 2004-01-04
  • 打赏
  • 举报
回复
你可以将每次抽取的 id 插入另一个表中设为B..(表B中应把id也设为主键, 使之不能重复)

考卷的表假设为A, 抽取的语句可以这样:

select top 1 id from A order by newid() where id not in(select id from B)

这样就是(乱序)随机抽取一条了, 而且是不重复的.
billy36 2004-01-04
  • 打赏
  • 举报
回复
用do while的话那么我无法在全部已经用完的时候得知已经用完了而会一直不停的循环下去。

我的意思我是在做一个随机为一个学生抽曲考试号的东西,而且全部的随机数只能在全部学生中使用一次。并且要写入数据库。而且这个考试号因为不知道学生有多少的缘故只能是一部分一部分的开放,所以在产生随机数的时候即要在开放的考试号都用完之后提示用户开放的号码已经用完请再开放。有要将得到的随机考试号写入数据库并且用数据库中的考试号来验证是否已经使用。
guanjm 2004-01-04
  • 打赏
  • 举报
回复
其实你可以先用数组记下出现过的随机数,然后在用循环来判断,因为用数据库调出来判断,速度太慢了,如果是一次执行的话,这样应该比从数据库快
ricky460 2004-01-04
  • 打赏
  • 举报
回复
楼主什么意思啊??
发帖子的时候拜托把问题说清楚一些 。 。 。

你的意思是不是不知道循环多少次才能够得到你想要的那个不重复的随机数??

你用do while不就可以了吗??
让程序一直循环下去 , 直到找到一个在数据库里没有的随机数 ,然后用exit跳出来。
为何要自己定义循环的次数呢 ???

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧