Random 数组长度范围内的Ada随机整数

Random 数组长度范围内的Ada随机整数,random,ada,Random,Ada,这是一个简单的问题,但我找不到任何可以帮助我的东西。。。 我想在图节点之间创建一些随机连接。要做到这一点,我需要做两个随机索引,然后连接节点 declare type randRange is range 0..100000; n1: randRange; n2: randRange; package Rand_Int is new ada.numerics.discrete_random(randRange);

这是一个简单的问题,但我找不到任何可以帮助我的东西。。。 我想在图节点之间创建一些随机连接。要做到这一点,我需要做两个随机索引,然后连接节点

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子句,a
use Ada.Numerics.Float\u Random。或者删除该选项,或者指定所需的生成器,即.gen:Rand_Int.generator

对于
mod
,您应该在实例化
离散随机
时指定所需的确切范围:

类型范围为0..n-1;--但是为什么从0开始呢?节点列表最好用1..n来描述
包Rand_Int是新的ada.numerics.discrete_random(randRange);

现在,没有必要使用
mod

正如其他人所回答的那样,生成器的不可见性是因为您有几个包的“use”子句,所有这些包都有一个生成器。因此,您必须指定“Rand_Int.Generator”以表明您希望从Rand_Int包中获得生成器

“非静态表达式”的问题是因为您试图定义一个新类型randRange,这意味着编译器必须决定它需要为该类型的每个值使用多少位,并且该类型必须具有编译时边界,即静态边界。您可以将其定义为子类型:

subtype randRange is Natural range 0 .. n-1;
然后编译器知道它可以使用与自然类型相同的位数。(这里我假设“n”是整数、自然数或正数;否则,使用“n”的任何类型。)


使用子类型也可以解决“预期类型”的问题。

您提到的错误消息与Ada中的可见性概念有关,这与大多数其他语言不同。理解可见性是理解Ada的关键。我建议初学者避免
use
,以避免此类use子句涉及的可见性问题。当您获得使用该语言的经验时,您可以尝试使用常见的pkg,例如
Ada.Text\u IO

由于您似乎来自一种语言,在这种语言中,数组必须具有从零开始的整数索引,因此我推荐使用它,它在描述Ada中的可见性方面做得非常好。这是ISO/IEC 8652:2007,但您应该不会有任何困难从该基础上学习Ada-12


如果您对获取RNG结果范围子范围内的随机整数值或浮点随机值所涉及的问题感兴趣,您可以查看中的
PragmARC.randomanness.Real_Ranges
PragmARC.randomanness.U32_Ranges
,谢谢,我是Ada的新手,我真的不知道如何解释错误。我想我从0开始是出于习惯。问题是,当我用
n-1
定义范围时,我得到了这样一个错误:
用于整数类型绑定的非静态表达式,
n”不是静态常量或命名数字(RM 4.9(5))
n`是由用户提供的,所以我猜它不可能是常量……我还得到了
预期类型”标准整数“
当涉及到
n1
n2
时,.n是未声明的。它与数组的关系也不可见。(同样,取一个随机数mod n也不足以作为错误计算。按照egil的建议,用适当的范围实例化随机生成器。)这必须在n的值已知后发生(例如,在declare块中,或在以n为参数的过程中)。