首页 文章

阿达:如何定义一个随机常数?

提问于
浏览
1

我目前正在通过John English'"Ada 95: The Craft of Object-Oriented Programming"工作 . 我在task 5.1

编写一个程序来玩一个简单的猜谜游戏 . 定义一个值范围为1到1000的整数类型,并将一个秘密值声明为此类型的常量,然后为用户提供十次猜测其值的机会 .

我写的(作为存根)现在是

procedure je_5_1 is
  type guess_value is new Integer range 1..1000;
  secret : guess_value;
  package random_guess_value is new Ada.Numerics.Discrete_Random(guess_value);
  Gen : random_guess_value.Generator;
begin
  random_guess_value.Reset(Gen);
  secret := random_guess_value.Random(Gen);
end je_5_1;

显然这没有实现 declare a secret value as a constant 的要求 . 但是因为在我可以将随机生成的值分配给 secret 之前我必须调用 Reset(Gen) ,所以我无法在 begin 之前将变量 secret 定义为常量 .

是否仍然可以将 secret 定义为随机常量?

3 回答

  • 2

    使用“声明”打开新范围 . 例如:

    with Ada.Text_IO; use Ada.Text_IO;
    
    procedure Example is
    
       package Integer_Text_IO is new Integer_IO (Integer);
       use Integer_Text_IO;
    
       A : Integer;
    
    begin
    
       Get(A);
    
       declare
          C : constant Integer := A; 
       begin
          Put(C);
       end;
    
    end Example;
    

    我认为文本所说的是你应该在编写代码时选择秘密值并将其“硬编码”插入源代码中 .

  • 2

    您可以在主过程的声明部分内创建另一个返回随机数的过程 .

    procedure je_5_1 is
      type guess_value is new Integer range 1..1000;
    
      function get_random return guess_value
      is
         package random_guess_value is new Ada.Numerics.Discrete_Random(guess_value);
         Gen : random_guess_value.Generator;
      begin
         random_guess_value.Reset(Gen);
         return random_guess_value.Random(Gen);
      end get_random;
    
      secret : constant guess_value := get_random;
    begin
       --do your 10 chance loop
    end je_5_1;
    
  • 2

    exercise后来建议你"Modify the program so that the value to be guessed is chosen at random each time the program is run."这要求在 Build 秘密值之前初始化Generator . 一种方法是将秘密值封装在Abstract State Machine中,如图所示here . 在下面的示例中, Generator 的一个实例是 Reset ,用于在详细描述包时执行的语句序列中初始化 Secret ,如herehere所述 .

    package Game_Model is
       subtype Guess_Value is Integer range 1 .. 1000;
       function Check(value : Guess_Value) return Boolean;
    end Game_Model;
    
    package body Game_Model is
       package Guess_Generator is new Ada.Numerics.Discrete_Random(Guess_Value);
       G: Guess_Generator.Generator;
       Secret : Guess_Value;
    
       function Check(Value : Guess_Value) return Boolean is
       begin
          return Value = Secret;
       end;
    
    begin
       Guess_Generator.Reset(G);
       Secret := Guess_Generator.Random(G);
    end Game_Model;
    

    鉴于已经猜到了 Value ,您可以根据程序的要求 Check .

    Value : Game_Model.Guess_Value;
    …
    Ada.Text_IO.Put_Line(Boolean'Image(Game_Model.Check(Value)));
    

相关问题