取不重复的随机数(200分)

  • 主题发起人 主题发起人 CJ
  • 开始时间 开始时间
C

CJ

Unregistered / Unconfirmed
GUEST, unregistred user!
需要一个如此的函数:-)

function RandomX(From,to,number:Integer):array[] of integer;

//from: 从几开始取;
//to: 取到几为止;
//number:取几个次
//其中:number < to - from, to > from;
//返回一个数组类型,其任何两个元素的值均不相等;
//呵呵:)
 
是不是想做一个电脑福利彩票的模拟程序? :)
建议哪位大虾做一个! :) :)
 
35个数字(1--35)选7个,不重复. 并且考虑概率.

$ $
~
 
这和随机法牌一个概念?不用那么复杂。
还有必须from-to <number,哈哈,否则,让上帝来帮你。
第一个办法
每抽出一个和已经抽出的比较,否则继续抽,如符合就加入
(适合于 from-to << number这中情况,为什么自己想)
第二种办法
先建立一个数组[from..to],在数组种随机抽样,如已经被抽走了
就取临近的一个一直到取到为止(不是再重新取,为什么自己想)
(适合于 from-to ~ number 这种情况)
结论综合两种情况,编两段大妈分别处治。
 

procedure RandomX(From,to,number:Integer;N:array of Integer);
var
Temp:Integer;
begin
if Number>(From-To) then Raise Exception.Create('无法生成。');
SetLength(N, Number);
N[0]:=-1;
for i:=1 to Number do
begin
Exist:=False;
repeat
Temp:=Random(To-From)+From;
for j:=0 to i-1 do if Temp=N[j] then
begin
Exist:=True;
Break;
end;
until not Exist;
N[i-1]:=Temp;
end;
end;


调用:
var
Num:array of Integer;
begin
Randomize;
RandomX(200,400,20,N);
.....
SetLength(N,0);
end;
 
更正:
var
Num:array of Integer;
begin
Randomize;
RandomX(200,400,20,Num);
.....
SetLength(Num,0);
end;
 
用我的这个函数改一下,

//对0~Count的取随机array,任意两个不重复

procedure RandomIntArray(Count:Integer;PInt:PIntArray);
var
boolArray:PIntArray;
I,K,ti,tk:Integer;
begin
Randomize;

//GetMem(result,Count*sizeof(Integer));

//set array to False
GetMem(boolArray,Count*sizeof(Integer));
FillChar(boolArray^,sizeof(Integer)*Count,0);

for I := 0 to Count-1 do
begin

//randow through 0-thum-1
ti:=Random(Count-i);
tk:=0;
for k:=0 to Count-1 do
begin
if BoolArray^[k] = 0 then
Inc(tk);
if tk-1=ti then
break;
end;
BoolArray^[k]:=1;
PInt^:=k;
end;

FreeMem(BoolArray);
end;

 
呵呵,谁还要我的帐号和密码?
条件:别改密码,分数低于一千了别问问题:)
 
妈的我的文字又被吃掉了
还有必须from-to 〈number,哈哈,否则,让上帝来帮你。

第一个办法
每抽出一个和已经抽出的比较,否则继续抽,如符合就加入
(适合于 from-to〈〈 number这中情况,为什么自己想)
第二种办法
先建立一个数组[from..to],在数组种随机抽样,如已经被抽走了
就取临近的一个一直到取到为止(不是再重新取,为什么自己想)
(适合于 from-to ~ number 这种情况)
结论综合两种情况,编两段大妈分别处治。
 
把取出的数压入一个链表中如果要求速度压入二叉树中,每次取数时先对比一下
这个数取过没有。
 
哈哈,说起彩票模拟,小弟上个月刚刚搞定一个,可惜我用的不是
整数随机数,俺用了了一个动态数组,里面存放的的是类似com guid
那样的字符串,也可以当随机数用,效果吗,反正客户很满意..

补充一下,产生com guid的构件我从深度历险上面找到的
 
看看我的,呵呵,正好前几天写了:

procedure RandomX(From,to,number:Integer;N:array of Integer);
var
iSite:array of integer;
iPos:integer;
begin
if Number>(From-To) then Raise Exception.Create('无法生成。');
if To < From then Raise Exception.Create('无法生成。');

SetLength(iSite, To - From + 1);
SetLength(N,Number);

for i:=From to To do
iSite[i-From] := i;

for i := 1 to Number do
begin
iPos := random(Length(iSite));
if iPos = Length(iSite) then iPos := 0;
N[i-1] := iSite[iPos];
iSite[iPos] := iSite[High(iSite)];
SetLength(iSite,Length(iSite) - 1);
end;
end;

 
>>产生com guid的构件我从深度历险上面找到的
呵呵,这也要控件? 怪不得蚯蚓强烈反对"控件主义". :-)

这样就可以生成一个GUID了

uses ole2;

var
G: TGUID;
UID: string;
begin
CoCreateGuid(G);
UID := GuidToString(G);

 
这个问题非常有意义.
 
这个问题也非常简单。
 
不好意思,哪位再用我的帐号问问题,记得别要邮件通知
 
呵呵,我还正纳闷呢,以为CJ忙的连这样的程序都没时间写了,原来.... :-)
 
cAkk:

连这个都用上了,我正要写的,没想到你占了先了.

;-)

menxin
 
呵呵,这个问题好结束了
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部