2006-01-24 数据库中随机抽取记录的问题 大家 找金蝶财务软件使用
然后 停的时候 第一次要选出50名三等奖 第二次要选出30名二等奖 第三次要选出
10名一等奖 第四次的时候要选出1个特等奖 每人只能得一次奖 这个怎么解决啊
那位提供一个思路都好啊 多谢了 我考虑了先产生一个随机数 根据随机数取数据
库中对应的行 ... 只是 这样难免不重复啊 比如第一次 700 中取 50 就会可能
产生重复了 兄弟们 拜托帮忙想想 明天就要抽奖啦
2楼: 晕
随机数你都知道了
不就解决了
取出的数,就不要再取了 如金蝶财务软件使用
3楼: 将选中的做标识,其余的再选
4楼: procedure TForm1.FormCreate(Sender: TObject);
var
v_Str: TStrings;
v_Count: Integer;
v_Index: Integer;
begin
v_Str := TStringList.Create;
for v_Count := 1 to 1000 do
v_Str.Add(''编号'' + IntToStr(v_Count));
Randomize;
for v_Count := 1 to 50 do
begin
v_Index := Random(v_Str.Count - 1);
Memo1.Lines.Add(v_Str.Strings[v_Index]);
v_Str.Delete(v_Index);
end;
v_Str.Free;
end;
5楼: SiWeiLiuLang 兄 你真是天才啊 佩服 佩服 谢谢你啦
我先去试试 有什么疑问再请教你啊
Avalon 兄 你的办法还是没有排除重复的可能性 因为在540中取50 即使是随机数
也有很大可能会重复取到同一个数的 谢谢你 一起考虑一下 我们还可以继续改进的嘛
6楼: 你没注意 v_Str.Delete(v_Index);
这样几句话吗??
我把抽中的从待选链表中删除 后面再怎么随机也无法重复啊
仓库管理软件版7楼: 啊 不好意思 我看太快了 那句没看清 这样的话确实是不会重复了
[:)] 呵呵 多谢指教啊 我先去试试了
8楼: 窗体里面摆两个Memo,一个用来显示当前的获奖者的编号,一个用来显示已经本次之前获奖的编号!
procedure TForm1.Button1Click(Sender: TObject);
var
i, ID : integer;
begin
if Memo1.Lines.Count > 0 then
Memo2.Lines.AddStrings(Memo1.Lines);
Memo1.Lines.Clear;
while Memo1.Lines.Count < SpinEdit1.Value do
begin
ID := Trunc(Random(699)) + 1;
if (Memo1.Lines.IndexOf(IntToStr(ID)) = -1) and
(Memo2.Lines.IndexOf(IntToStr(ID)) = -1) then
Memo1.Lines.Add(IntToStr(ID));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo2.Clear;
end;
9楼: Avalon 兄 你的方法很好啊 很方便的 新年愉快啊
royal1442 兄 多次得到你的帮助 非常感谢你 呵呵 祝你拿个大红包
SiWeiLiuLang 兄 你的提议很好 给了我一个解决的思路 真是多谢了
多承以上诸位指点 问题得以顺利解决了 呵呵 谢谢上面几位兄台了 [8D]