数组长度范围内的 Ada 随机整数
Ada random Integer in range of array length
这是一个简单的问题,但我找不到任何可以帮助我的东西...
我想在图形节点之间创建一些随机连接。为此,我想做两个随机索引,然后连接节点。
declare
type randRange is range 0..100000;
n1: randRange;
n2: randRange;
package Rand_Int is new ada.numerics.discrete_random(randRange);
use Rand_Int;
gen : Generator;
begin
n1 := random(gen) mod n; -- first node
n2 := random(gen) mod n;
我想用数组的长度来定义范围,但我遇到了错误。尽管如此,它还是无法编译。
我也不能执行模运算,因为 n
是自然的。
75:15: "Generator" is not visible
75:15: multiple use clauses cause hiding
75:15: hidden declaration at a-nudira.ads:50, instance at line 73
75:15: hidden declaration at a-nuflra.ads:47
而且我不知道这些错误是什么意思 - 显然,我的生成器出了点问题。
如果有人告诉我做这件简单事情的正确方法,我将不胜感激。
您没有向我们展示重现错误所需的完整代码,但错误消息表明您在某处有另一个 use 子句,一个 use Ada.Numerics.Float_Random;
。要么删除它,要么指定你想要的生成器,即。 gen : Rand_Int.Generator;
.
至于mod
,您应该在实例化Discrete_Random
时指定您想要的确切范围,而不是:
type randRange is 0..n-1; -- but why start at 0? A list of nodes is better decribed with 1..n
package Rand_Int is new ada.numerics.discrete_random(randRange);
现在,不需要 mod
正如其他人所回答的那样,Generator 的不可见性是由于您对所有具有 Generator 的包都有几个“使用”子句。因此,您必须指定“Rand_Int.Generator”以表明您需要 Rand_Int 包中的生成器。
“非静态表达式”出现问题是因为您尝试定义一个新类型 randRange,这意味着编译器必须决定它需要为该类型的每个值使用多少位,以及该类型必须具有编译时间,即静态边界。您可以将其定义为子类型:
subtype randRange is Natural range 0 .. n-1;
然后编译器知道它可以使用与自然类型相同的位数。 (我在这里假设“n”是整数、自然数或正数;否则,使用“n”的任何类型。)
使用子类型也应该可以解决“预期类型”的问题。
您提到的错误消息与 Ada 中的 visibility 概念有关,这与大多数其他语言不同。理解可见性是理解 Ada 的关键。我建议初学者避免使用 use <package>
以避免此类使用子句涉及的可见性问题。随着您获得该语言的经验,您可以尝试使用常见的 pkg,例如 Ada.Text_IO
.
由于您似乎来自一种语言,其中数组必须具有从零开始的整数索引,因此我推荐 Ada Distilled,它在描述 Ada 中的可见性方面做得非常出色。它是 ISO/IEC 8652:2007,但是从那个基础上你应该没有困难选择 Ada-12。
如果您对获取 RNG 结果范围子范围内的随机整数值或浮点随机值所涉及的问题感兴趣,可以查看 PragmARC.Randomness.Real_Ranges
和 PragmARC.Randomness.U32_Ranges
在 PragmAda Reusable Components.
这是一个简单的问题,但我找不到任何可以帮助我的东西... 我想在图形节点之间创建一些随机连接。为此,我想做两个随机索引,然后连接节点。
declare
type randRange is range 0..100000;
n1: randRange;
n2: randRange;
package Rand_Int is new ada.numerics.discrete_random(randRange);
use Rand_Int;
gen : Generator;
begin
n1 := random(gen) mod n; -- first node
n2 := random(gen) mod n;
我想用数组的长度来定义范围,但我遇到了错误。尽管如此,它还是无法编译。
我也不能执行模运算,因为 n
是自然的。
75:15: "Generator" is not visible
75:15: multiple use clauses cause hiding
75:15: hidden declaration at a-nudira.ads:50, instance at line 73
75:15: hidden declaration at a-nuflra.ads:47
而且我不知道这些错误是什么意思 - 显然,我的生成器出了点问题。 如果有人告诉我做这件简单事情的正确方法,我将不胜感激。
您没有向我们展示重现错误所需的完整代码,但错误消息表明您在某处有另一个 use 子句,一个 use Ada.Numerics.Float_Random;
。要么删除它,要么指定你想要的生成器,即。 gen : Rand_Int.Generator;
.
至于mod
,您应该在实例化Discrete_Random
时指定您想要的确切范围,而不是:
type randRange is 0..n-1; -- but why start at 0? A list of nodes is better decribed with 1..n
package Rand_Int is new ada.numerics.discrete_random(randRange);
现在,不需要 mod
正如其他人所回答的那样,Generator 的不可见性是由于您对所有具有 Generator 的包都有几个“使用”子句。因此,您必须指定“Rand_Int.Generator”以表明您需要 Rand_Int 包中的生成器。
“非静态表达式”出现问题是因为您尝试定义一个新类型 randRange,这意味着编译器必须决定它需要为该类型的每个值使用多少位,以及该类型必须具有编译时间,即静态边界。您可以将其定义为子类型:
subtype randRange is Natural range 0 .. n-1;
然后编译器知道它可以使用与自然类型相同的位数。 (我在这里假设“n”是整数、自然数或正数;否则,使用“n”的任何类型。)
使用子类型也应该可以解决“预期类型”的问题。
您提到的错误消息与 Ada 中的 visibility 概念有关,这与大多数其他语言不同。理解可见性是理解 Ada 的关键。我建议初学者避免使用 use <package>
以避免此类使用子句涉及的可见性问题。随着您获得该语言的经验,您可以尝试使用常见的 pkg,例如 Ada.Text_IO
.
由于您似乎来自一种语言,其中数组必须具有从零开始的整数索引,因此我推荐 Ada Distilled,它在描述 Ada 中的可见性方面做得非常出色。它是 ISO/IEC 8652:2007,但是从那个基础上你应该没有困难选择 Ada-12。
如果您对获取 RNG 结果范围子范围内的随机整数值或浮点随机值所涉及的问题感兴趣,可以查看 PragmARC.Randomness.Real_Ranges
和 PragmARC.Randomness.U32_Ranges
在 PragmAda Reusable Components.