请教一个问题,随机插入函数

tatty_bad 2009-05-08 12:20:39
我现在需要在20000个记录的一个独立字段里,随机的写入字母A,1个,字母B,5个,字母C,40个,字母D,8000个。其他的11954个记录不需要写入。

请问如何做到随机插入,我现在没有一个好的思路。

这类似于把一些奖项,随机分布在中奖卡里面。

如果做到随机选取,随机插入,不是把A写入了,再写B,然后再写C,D,应该是随机的选择ABCD中的一个,然后写入,但是A只能是一个,B只能是5个,C只能是40个,D只能是8000个。

我的思路是把ABCD写入数组,把对应的数量也写入数组,然后利用随机数选择ABCD中的一个,同时获得该字母对应的剩余数量,如果等于0,就重新随机选择。

但是我觉得这样做有些太麻烦,不是最优选择。

请这方面的高人帮我做一个思路、函数。谢谢了。

采用的高分送上。
...全文
142 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你该字段里开始都是为空的?
tatty_bad 2009-05-08
  • 打赏
  • 举报
回复
谢谢楼上的朋友,问题解决,分给上!
smartcatiboy 2009-05-08
  • 打赏
  • 举报
回复
上面这个只能保证分配的abcd不重复
要保证选取的slot不重复可以用线性开区间的办法

Class CBucket
Private m_achr
Private Sub class_initialize()
ReDim m_achr(2000-1)
End Sub

Public property Let Item(chrHit)
Dim i
i=Int(Rnd()*UBound(m_achr))
'这里利用线性开区间的算法,找到一个空位,确保不获取已分配的slot
Do While Not(m_achr(i) Is Empty)
i=(i+1) Mod UBound(m_achr(i))
Loop
m_achr(i)=chrHit
End property
End Class
smartcatiboy 2009-05-08
  • 打赏
  • 举报
回复
Option Explicit 

Randomize

Class CHit
Private m_aintCount,m_intCount

Private Sub class_initialize()
Dim i
m_aintCount=Array(1,50,400,8000) 'init char count
For i=0 To UBound(m_aintCount)
m_intCount=m_intCount+m_aintCount(i) 'init total char count
Next

End Sub

'wscript debug only
Public Sub debug()
MsgBox Me.Item & vbcrlf & Join(m_aintCount) & vbcrlf & m_intCount
End Sub

Public property Get Count()
Count=m_intCount
End property

Public property Get Item()
Dim i,intFind
intFind=Int(Rnd()*m_intCount)
'逐次判断概率区间,若生成数落在某个区域,则其值必定为负
For i=0 To UBound(m_aintCount)
intFind=intFind-m_aintCount(i)
If intFind<0 Then Exit For
Next
If i>ubound(m_aintCount) Then
'all char count is zero, none item create.
Item=Empty
Else
m_aintCount(i)=m_aintCount(i)-1
m_intCount=m_intCount-1
Item=Chr(&H41+i)
End If
End property
End Class

dim obj
randomize
set obj=new CHit
do while obj.Count>0
response.write obj.Item
'rst.absoluteposition=int(rnd()*2000)+1
'rst("hit")=obj.Item
loop
tatty_bad 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gingerkang 的回复:]
select top 8046 * from xxx order by newid()
用个变量计数,循环去更新,直接这样不可以吗?
[/Quote]

不涉及数据库的,只是一个随机抽取函数
gingerkang 2009-05-08
  • 打赏
  • 举报
回复
select top 8046 * from xxx order by newid()
用个变量计数,循环去更新,直接这样不可以吗?
tatty_bad 2009-05-08
  • 打赏
  • 举报
回复
呵呵,20000是总量,就是说在这个总量里,我需要插入1个A,5个B,40个C,8000个D,随机分布。

就是需要一个函数,来随机选择ABCD中的一个,但是这四个是有个数限制的。
xiaojing7 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tatty_bad 的回复:]
需要形成一个8046的数组?
然后从中取?

这也太夸张了。
[/Quote]
===============
分作4个数组
每个里面的值不是一样的嘛,有必要做8046次吗?
然后记录2维数
循环读取
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tatty_bad 的回复:]
不是这样的,应该说,是每往数据库里插入一条记录,在插入之前,就已经做好这个随机插入字母的处理了。

也就是说这个随机字母的选择,不涉及数据库,只是需要一个函数,来处理如何选择这个字母,因为不只是随机,还要有次数限制。
[/Quote]
你的是一次性做+1+5+40+8000次随机?

那你所说的20000个记录是什么意思?

迷糊了
tatty_bad 2009-05-08
  • 打赏
  • 举报
回复
需要形成一个8046的数组?
然后从中取?

这也太夸张了。
xiaojing7 2009-05-08
  • 打赏
  • 举报
回复
我觉得应该采用数组。然后再随机地调用数组
tatty_bad 2009-05-08
  • 打赏
  • 举报
回复
不是这样的,应该说,是每往数据库里插入一条记录,在插入之前,就已经做好这个随机插入字母的处理了。

也就是说这个随机字母的选择,不涉及数据库,只是需要一个函数,来处理如何选择这个字母,因为不只是随机,还要有次数限制。
  • 打赏
  • 举报
回复
你这个肯定得判断数据库里存在里了多少记录才能知道要不要update啊
tatty_bad 2009-05-08
  • 打赏
  • 举报
回复
是的,开始都是空的,默认为0,也就是不需要写入

28,409

社区成员

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

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