delphi – 如何在pascal中生成彼此唯一的随机整数
发布时间:2020-12-15 09:50:22 所属栏目:大数据 来源:网络整理
导读:我想在pascal中创建一个程序,在1到49之间选择6个随机整数.每个数字应该是唯一的,即你不能拥有’8,22’22’32’37’43’因为’22’被重复.如何我可以在Delphi中实现这个吗? 我可以使用以下代码在1 – 49之间获得6个随机数. for i := 1 to 6 do begin num[i]
我想在pascal中创建一个程序,在1到49之间选择6个随机整数.每个数字应该是唯一的,即你不能拥有’8,22’22’32’37’43’因为’22’被重复.如何我可以在Delphi中实现这个吗?
我可以使用以下代码在1 – 49之间获得6个随机数. for i := 1 to 6 do begin num[i] := random(49) + 1 end {next}; 解决方法
我会这样做:
>将数字1到49放入数组中. 它可能不是最有效的方法,但它易于实现,易于理解,最重要的是,易于推理您的采样方法的分布属性. 对于shuffle,请使用Fisher-Yates shuffle.我在这个泛型方法中实现了这个: procedure TRandomNumberGenerator.Permute<T>(var Values: array of T); var i,Count: Integer; begin Count := Length(Values); for i := 0 to Count-2 do TGeneric.Swap<T>(Values[i],Values[i + Uniform(Count-i)]); end; 统一(N)是我的RNG的函数,它返回从0..N-1上的均匀分布中提取的值.您可以在代码中将其替换为Random.并且TGeneric.Swap< T>交换这两个元素. 你可以修改它来处理一个整数数组,如下所示: procedure Swap(var lhs,rhs: Integer); var tmp: Integer; begin tmp := lhs; lhs := rhs; rhs := tmp; end; procedure Permute(var Values: array of Integer); var i,Count: Integer; begin Count := Length(Values); for i := 0 to Count-2 do Swap(Values[i],Values[i + Random(Count-i)]); end; 当然,你只需要执行循环的前六次迭代,所以一个非常有效的版本将是这样的: function Choose(M,N: Integer): TArray<Integer>; var i: Integer; Values: TArray<Integer>; begin Assert(M>0); Assert(N>=M); SetLength(Values,N); for i := 0 to N-1 do Values[i] := i+1; for i := 0 to Min(M-1,N-2) do Swap(Values[i],Values[i + Random(N-i)]); Result := Copy(Values,M); end; 你会称这传球6和49: Values := Choose(6,49); 如果你是一个疯狂的表演怪胎,那么我认为很难打败这个: type TArr6 = array [0..5] of Integer; PArr6 = ^TArr6; TArr49 = array [0..48] of Integer; const OrderedArr49: TArr49 = ( 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 ); function Choose6: TArr6; var i: Integer; Values: TArr49; begin Values := OrderedArr49; for i := 0 to high(Result) do begin Swap(Values[i],Values[i + Random(Length(Values)-i)]); end; Result := PArr6(@Values)^; end; 我应该说我怀疑性能是这里的驱动因素. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |