各位大哥,怎样以随机的方式抽取一个记录集呢?小妹在线等待!!~~~~

xiaoyan21 2002-04-30 09:17:28
大家好,小妹在做一个考试系统。现在关键的一步就是形成试卷了,
请问,怎样以随机的方式抽取,并形成记录集呢??
能给我一些原代码吗??
数据访问组件用ADOTable,或 ADOQuery.
...全文
85 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ihihonline 2002-04-30
  • 打赏
  • 举报
回复
是的,方法很简单,但,我想,你应该保存质量;
在控制方面要多做点事;
墨梅无痕 2002-04-30
  • 打赏
  • 举报
回复
我觉得未必只需要随机那么简单。

从题库中随机抽取题目并形成试卷,如果没有一个数学系的朋友给你设计一个算法,那么这份试卷的质量是不会令人满意的。

我觉得,首先要和任课老师交流一下,看看他们抽取题目的方式是什么样的,然后再针对分类好的题库,采用半随机的方式抽取题目形成试卷,并按试卷的难度要求分成等级。

所谓半随机方式是指在同样的难度,同样的题型的条件下,可以随机的抽取题目。
王集鹄 2002-04-30
  • 打赏
  • 举报
回复
如果还没有思路
就提供库表结构
这样好给你组织
tomjoule 2002-04-30
  • 打赏
  • 举报
回复
数组+循环语句+Random+布尔型变量 可是现不重复抽题
王集鹄 2002-04-30
  • 打赏
  • 举报
回复
to xiaoyan21:你把问题阐述不就可以了!
//参考

主  题: 考考大家:如何随机从若干个数据中抽出指定个数据?//Kingron
作  者: Kingron (对CSDN愤怒中……)
等  级:
信 誉 值: 107
所属论坛: Delphi
问题点数: 50
回复次数: 91
发表时间: 2001-12-9 10:58:59



我看看大家对于编程的功底如何?例如从54个牌中,随机抽4张,请写出算法!
大家不要就直接用4次Random(54)就完事儿啊,再仔细想想?



回复人: BlueTrees(蜗牛) ( ) 信誉:95 2001-12-9 11:10:21 得分:50


假设数组cards[1..54]存放的是牌的的花色,TCard是花色的类型
那么可以这样
procedure get4card(var c1,c2,c3,c4:TCard);
var
card:TCard;
I,J:Integer;
begin
for J:=0 to 3 do
begin
I:=Radom(53-J)+1;
card:=Cards[I];
Cards[I]:=Cards[54-J]
Cards[54-J]:=card;
end;
c1:=Cards[54];
c2:=Cards[53];
c3:=Cards[52];
c4:=Cards[51];
end;
可以给分了吧!




回复人: zswang(伴水)(* pascal→c *) ( ) 信誉:99 2001-12-10 9:56:35 得分:0


procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
Randomize;
Memo1.Clear;
for I := 0 to 53 do Memo1.Lines.Add(IntToStr(I));
end;

function Sortition1(mSource: TStrings; mDest: TStrings;
mCount: Integer): Boolean;
var
I, J: Integer;
begin
Result := True;
try
mDest.Clear;
for I := 1 to mCount do begin
J := Random(mSource.Count);
mDest.Add(mSource[J]);
mSource.Move(J, mSource.Count - I);
end;
except
Result := False;
end;
end; { Sortition1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
Sortition1(Memo1.Lines, Memo2.Lines, 4);
end;

回复人: zswang(伴水)(* pascal→c *) ( ) 信誉:99 2001-12-10 10:15:57 得分:0


function Sortition2(mSource: TStrings; mDest: TStrings;
mCount: Integer): Boolean;
var
I, J, K, L: Integer;
vCnt: Integer;
begin
Result := True;
try
mDest.Clear;
vCnt := 0;
for I := 1 to mCount do begin
J := Random(mSource.Count - vCnt);
L := 0;
for K := 0 to mSource.Count - 1 do
if mDest.IndexOf(mSource[K]) < 0 then begin
if L = J then begin
mDest.Add(mSource[J]);
Inc(vCnt);
Break;
end;
Inc(L);
end;
end;
except
Result := False;
end;
end; { Sortition2 }
jerremy1364 2002-04-30
  • 打赏
  • 举报
回复
将已经抽取的题目的唯一标识号记录下来,下次抽取的时候判断是否已经有了,就可以避免抽取重复的。
顺便问一下,你的文章怎样存进数据库的
Borlandor 2002-04-30
  • 打赏
  • 举报
回复
It's wrong!

if No in NoSet then

should be:

if No not in NoSet then
Borlandor 2002-04-30
  • 打赏
  • 举报
回复
自己加以控制:

var No: Integer;
NoSet: Set of Integer;
begin
Randomize;
No := Random(ADOTable.RecordCount);
if No in NoSet then
 begin
  ADOTable.Locate('No',[No],[]);
Include(NoSet,No);
end else
...
end
...
end;

xiaoyan21 2002-04-30
  • 打赏
  • 举报
回复
to: zswang

可以,如果这样做的话,很可能存在重复抽取的问题啊,?
Borlandor 2002-04-30
  • 打赏
  • 举报
回复
var No: Integer;
begin
Randomize;
No := Random(ADOTable.RecordCount);
ADOTable.Locate('No',[No],[]);
...
end;
王集鹄 2002-04-30
  • 打赏
  • 举报
回复
//同意bisc
var
I: Integer;
begin
Randomize;
I := Random(ADOTable1.RecordCount);
ADOTable1.RecNo := I; //得一题!
end;
格兰特杨 2002-04-30
  • 打赏
  • 举报
回复
生成随机数i,然后在记录集里Move i。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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