gpt4 book ai didi

random - Ada 随机数是相同的

转载 作者:行者123 更新时间:2023-12-05 01:02:14 25 4
gpt4 key购买 nike

我的函数有以下问题,它应该返回一个随机数字。当我想通过调用该函数生成几个数字时,它们完全相同。如何解决调用函数时一直返回相同数字的问题?我需要那个随机来保持功能。

这是代码:

with Ada.Numerics.discrete_Random

function generate_random_number ( n: in Positive) return Integer is
subtype Rand_Range is Integer range 0 .. n;
package Rand_Int is new Ada.Numerics.Discrete_Random(Rand_Range);
use Rand_Int;
gen : Rand_Int.Generator;
ret_val: Rand_Range;
begin
Rand_Int.Reset(gen);
ret_val := Random(gen);

return ret_val;
end;

最佳答案

随机生成器 gen不应该是函数的局部。目前,您正在每个 generate_random_number 上重新创建它调用并初始化它,所以你总是得到相同的结果也就不足为奇了。

如果您制作 gen - 例如 - 一个全局变量,初始化一次,然后每次使用它你都会得到一个新的随机数。 (是的,全局变量不好:但见下文)

不幸的是,这与 function generate_random_number ( n: in Positive) 的语义关系不太好。这可以每次不同地限制随机数的范围。最简单的解决方案是使gen返回任何有效整数并使用模算术为每次调用返回正确范围内的数字。这会起作用,但您应该意识到它可能会引入加密弱点,超出了我的分析能力。

如果是这种情况,您将需要不同的方法,例如为您需要的每个范围创建一个不同的随机生成器;注意以不同的方式播种(重置)它们,否则可能会再次出现加密弱点,例如不同生成器之间的相关性。

现在,由于任何语言中的所有常见原因,全局变量的结构都很糟糕。因此,更好的方法是将其包装在一个包中使其成为资源。

package RandGen is
function generate_random_number ( n: in Positive) return Positive;
end RandGen;

这就是客户需要看到的全部内容。该包实现如下:
with Ada.Numerics.discrete_Random;
package body RandGen is

subtype Rand_Range is Positive;
package Rand_Int is new Ada.Numerics.Discrete_Random(Rand_Range);

gen : Rand_Int.Generator;

function generate_random_number ( n: in Positive) return Integer is
begin
return Rand_Int.Random(gen) mod n; -- or mod n+1 to include the end value
end generate_random_number;

-- package initialisation part
begin
Rand_Int.Reset(gen);
end RandGen;

编辑:雅各布拒绝超出范围值的建议更好,但如果 n 远小于生成器范围,则效率低下。一种解决方案可能是创建多个生成器并让 generate_random_number函数选择覆盖 0 .. N 且浪费最少的那个。

关于random - Ada 随机数是相同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26786059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com