Delphi中随机函数Random应用两则

1. 自动随机出题 
  你也许有这样的经历:孩子刚上学,数学老师要你每天给出10或者20道算术题,作为你孩子的家庭作业,
你是否有点烦?别着急,电脑可帮你忙! 

在Delphi中,有一随机函数,是这样定义的:
function Random [ ( Range: Integer) ];
其中,参数Range为一整数,
该函数返回值也为整数,其范围为:
0< =Random(Range)< Range   (指定Range)
0< =Random< 1   (不带参数Range)
  下面的过程for循环里第一条语句:在屏幕上输出九九表内乘法的随机题;第二条语句:
在屏幕上输出一百以内的加法随机题。稍加修改,增加一些条件语句你即可得到得减法、除法及四则
混合运算的随机题。当然,你也可以直接将结果输出在打印机的画布(Canvas)上,打印给你的孩子做。 
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
Randomize;
for I := 1 to 10 do begin
Canvas.TextOut(20,I*20,
IntToStr(Random(9)+1)+'×'+IntToStr(Random(9)+1)+'=');
Canvas.TextOut(220,I*20, 
IntToStr(Random(100))+'+'+IntToStr(Random(100))+'=');
end;
end;
  2. 随机产生体育彩票号码 

  时下彩票在全国范围内风行,朋友们买彩票都嫌挑选号码较为头痛,要求我在电脑上想点办法。
我想这无非是产生随机数,于是用Delphi的随机函数Random编写了一段程序,具体实现方法见如下程序
(SportUnit.pas)。 

unit SportUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, 
Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;//以上用于放置七位号码
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Timer1: TTimer;
Label8: TLabel;
Timer2: TTimer;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
timer1.Enabled:=True;
timer2.Enabled:=True;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
timer1.Enabled:=false;
timer2.Enabled:=false;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Randomize;
Label1.Caption:=IntToStr(Random(10));
Label2.Caption:=IntToStr(Random(10));
Label3.Caption:=IntToStr(Random(10));
Label4.Caption:=IntToStr(Random(10));
Label5.Caption:=IntToStr(Random(10));
Label6.Caption:=IntToStr(Random(10));
//随机产生0-9整数
Label7.Caption:=IntToStr(Random(5));
//随机产生0-4整数,第七位为特别号
Application.ProcessMessages;
//处理Windows消息,属简单多线程
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Label8.Caption:=FormatDateTime('yyyy"年"m"月"d
"日"dddd',date)+'   '+TimeToStr(time);
end;
end.
  此程序段中的定时器Timer2只为显示时间秒而定义,按钮 BitBtn1和 BitBtn2可以只用一个
(求逆反运算即可),所以该程序段还可优化精简。

 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
delphi产生随机数2009-07-27 18:58//用delphi产生不重复的随机数 ****************************************************************************************** var aa : array[1..36] of string[2]; //aa数组为需要随机排列的数组,{先把1..36按顺序给aa数组赋值} procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin for i:=1 to 36 do begin aa[i]:=inttostr(i); bb[i]:=inttostr(i); end; end; {随机进行排列} procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; swapa:string[2]; begin randomize; //随机数初始化*一定要有,不然下次运行时候产生的随机数仍然和这次相同* for i:=1 to 36 do begin j:=1+random(36); swapa:=aa[i]; aa[i]:=aa[j]; aa[j]:=swapa; end; //由此得到不重复的随机排列数字 ***************************************************************************************** 如何产生34-456之间的随机Randomize; 34+Random(456-34+1); ×××××××××××××××××××//下面是扫雷游戏的一个编法 procedure TForm1.Button1Click(Sender:TObject); begin Randomize; Memo1.Lines.Add(IntToStr(Random(20))); end; ×××××××××××× ***************************************************************************************** 随机数相关的几个函数: 1、RandSeed;//随时机数发生的“种子”。如果不赋值那么每次执行产生的随机数列是一样的。 所以该值必须每次调用均应是不同值。 2、Randomize;//用当前机器时间作为“种子”初始化随机数发生器。 3、Random() ;//由“种子”初始化的随机数出发,开始产生随机数序列 但是DelphiRandom()产生的是伪随机数,也就是说,程序的两次运行,Random()产生的随机数是一样的。 先运行一下Randomize,再Random就是真正的随机数了 即: Randomize //初始化随机数发生器 Random() ********************************************************************************************* delphi 如何产生不重复随机数 pascal里的随机随机数是指理论上没有规律可循、在指定范围内每个数的出现几率相等、无法根据之前的数来预测下一个数的数列。一般随机数生成器的基本原理是:首先初始化一个随机种子,其初始值可以是任意的整数;在每次获取随机数时,以随机种子为基础进行某种特殊的运算,获得一个随机数并返回之,然后再对随机种子进行某种运算,改变随机种子的值。这样,就可以生成许多比较随机的数,但同一个初始值的随机种子将会生成完全相同的随机数列。 Pascal的System单元提供了两个与随机数有关的子程序:Randomize和RandomRandomize过程用于初始化随机种子,其初始值取决于当前的系统时钟。 Random函数用于获取随机数 它有两种调用形式: Random,返回一个0到1之间(不包括1)的随机实数; Random(N),返回0至N之间(不包括N)的随机整数,N为Word类型整数。 另外,System单元随机种子变量的标识符为RandSeed,你也可以手动修改它。随机数在信息学奥林匹克可用于随机化搜索、穷举等算法,以优化其性能,也可用于在快速排序选择关键数,以使其快速排序算法的最坏情况没有固定的相应数列。如果你希望使用随机数的程序对同一个输入数据能有恒定的输出结果,可以设置RandSeed为一个定值。 ************************************************************************************************* 一个变态小算法 ******************************* 比较耗费机时,如果产生的数目少,就不要用这个算法了。 计算的是在一个范围内(如1-1000),随机抽取n个不相等的随机数。我的思想就是先定义一个用来存放的数组(这当然是必须的啦,废话),然后定义了一个二维数组(感觉很浪费空间),这个二维数组是用来存放已经生成随机数的范围,当然不是随意存放了,要按照自然顺序,但这还不必要定义二维的。二维主要是存放一个范围,即某一列的第一行存放的是范围的小值,而第二行存放的是范围的大值。这样新生成的随机数肯定是在范围之外的,因为范围是已生成随机数的范围啊。这样,每次取随机数时,先随机抽取在某两个范围数组值之间,再在这两个范围数组值之间取随机数。基本上就是这样了。 public class random { int count=500; //个数 int min=1; //最小值 int max=1000; //最大值 int[] r=new int[count]; //随机数存储数组 int[][] k=new int[2][count+2]; //存储范围数组,用于判断范围值 //一维数组用来存放范围的小值,二维用来存放大值 int l=0; //存储空间大小 public random() //初始化范围 {k[0][0]=min-1; k[1][0]=min-1; k[0][2]=max+1; k[1][2]=max+1; l=3; } public int ran(){ //来一个可以制造随机整数的东西 return (int)(Math.random()*1000000000); } public void p(int x,int c) //用来比较存储数组 { for(int i=0;i<l;i++){ if(x<k[0][i]){ //小于当前值时插入,数组是按自然顺序存储的 //如果生成的随机数与当前值的偏差为1,与当前值合并 if(k[0][i]-x==1){ k[0][i]=x; if (k[0][i]-k[1][i-1]==1) //如果与前一个范围值的最大值的值差为1与前一个值合并 {k[1][i-1]=k[1][i]; move(l-1,i); l--;} break;} //如果与但前范围值差大于1 else{ for(int j=l;j>i;j--){ //后移数组为插入值留个位置 k[0][j]=k[0][j-1]; k[1][j]=k[1][j-1]; } k[0][i]=x; //插入值 k[1][i]=x; l++; if (k[0][i]-k[1][i-1]==1) //如果插入值与前一个范围值相差1,则与前一个值合并 {k[1][i-1]=k[1][i]; move(l-1,i); l--;} break; }} } } public void move(int m,int n) //与前一个范围值合并的函数 { for(int j=n;j<m;j++){ k[0][j]=k[0][j+1]; k[1][j]=k[1][j+1];} k[0][m]=0; k[0][m]=0; } public void r(){ //生成随机数的主函数 r[0]=ran()%max+min; //插入第一个值 if(r0==1) k[1][0]=r[0]; else{ k[0][1]=r[0]; k[1][1]=r[0];} for(int i=1;i<count;i++){ int z; if(l>2) z=ran()%(l-2); //判断有多少个空隙,就是有多少个范围,然后随机选取一个 else z=0; r[i]=ran2(k[0][z+1],k[1][z]); //在选取的范围制造随机数 p(r[i],i); } } public int ran2(int x,int y){ //在固定范围内制造随机数 int m=x-y; m=ran()%(m-1); return m+y+1; } /*public static void main(String[] args) { random rr=new random(); rr.r(); for(int i=0;i<rr.count;i++) }*/ }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值