Random 生成包含随机元素的表

Random 生成包含随机元素的表,random,ada,tabular,Random,Ada,Tabular,我是Ada编程新手。我正在尝试生成一个80列40行的表,每个案例随机填充M或V。任何关于如何创建此类表的帮助都将不胜感激 以下是到目前为止我在.ads表格中的内容: package Life is type Grid is (mort, vivant); type TableauCell is array ( 0..80, 0..40 ) of Grid; procedure Grid_Random_Fill(A : in out Grid); end Life; 以及随机

我是Ada编程新手。我正在尝试生成一个80列40行的表,每个案例随机填充M或V。任何关于如何创建此类表的帮助都将不胜感激

以下是到目前为止我在.ads表格中的内容:

     package Life is
type Grid is (mort, vivant);
     type TableauCell is array ( 0..80, 0..40 ) of Grid;
procedure Grid_Random_Fill(A : in out Grid);
end Life;
以及随机化:

    with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Numerics.Discrete_Random ;
use Ada.Text_IO, Ada.Integer_Text_IO;

package body Life is

procedure Grid_Random_Fill is
         type  Life is (V, M);

   package Random_Life is new Ada.Numerics.Discrete_Random (Life) ;
   use Random_Life ;
   G : Generator ;
 begin
   Reset (G) ; -- intialise the generator
   loop
 Case Random(G) is
 when V => 
      put("V"); -- put V in table
 when M =>
    put("M"); -- put M in table
   end case;  
    end loop ;
end Grid_Random_Fill;
       end life;

不幸的是,我无法编译它——我也不知道如何自动将M和V生成到我的表中。我不确定我是否清楚,我对编码都是新手。

这听起来像是家庭作业,所以这将有点抽象

声明一个表示M和V的两元素类型

声明该类型的80x40数组

使用该类型实例化


迭代数组边界,通过调用random number包的random()函数来设置每个数组元素。

既然这有家庭作业的感觉,那么一个过于复杂、过于概括的示例如何? 除了随机化之外,一切都正常,这是留给读者的练习

Test\u Table.adb

With
Tabling,
Ada.Streams.Stream_IO,
Ada.Text_IO.Text_Streams;

Use
Ada.Text_IO;

Procedure Test_Table is
    -- Here we declare a stream and associate it with the standard-output, 
    -- this can easily be altered to any file. Yay streams!
    Output : Access Ada.Streams.Root_Stream_Type:= 
        Ada.Text_IO.Text_Streams.Stream( Standard_Output );

    Package test is new Tabling( Rows => 40, Cols => 80 );

    temp : test.Table;

Begin
    -- A single line to write the table.
    Test.Table'Write( Output, temp );
    New_Line;
End Test_Tables;
package body Tabling is
-- Quick definition of the new-line, windows-style.
New_Line : Constant String:= ASCII.CR & ASCII.LF;

-- Implementations of our stream writing functions.
Procedure Write(
    Stream  : access Root_Stream_Type'Class;
    Item    : in Element_Type) is
-- Convert takes the element-type and transforms it into a character.
Function Convert (Input : Element_Type:= Item) Return Character is
begin
    -- A simple mapping using case, it also has the advantage of raising
    -- a compiler error should the valuse "Element_Type" can take change.
    case Input is
    when 'M' => return 'm';
    when 'V' => return 'v';
    end case;
end Convert;
begin
Character'Write( Stream, Convert );
end Write;


Procedure Write(
    Stream  : access Root_Stream_Type'Class;
    Item    : in Col) is
begin
-- Using the new-style for-loop, we iterate over the given columns,
-- taking care to wrap the elements in the table's cell-definition tag.
for Element of Item loop
    String'Write( Stream, ASCII.HT & "<td>" );
    Element_Type'Write( Stream, Element );
    String'Write( Stream, "</td>" & New_Line );
end loop;
end Write;


Procedure Write(
    Stream  : access Root_Stream_Type'Class;
    Item    : in Row) is
begin
-- Using the new-style loop, we iterate through the row, wrapping each
-- in the table-row tag, <tr>.
for Element of Item loop
    String'Write( Stream, "<tr>" & New_Line);
    col'Write( Stream, Element );
    String'Write( Stream, "</tr>" & New_Line);
end loop;
end Write;


Procedure Write(
    Stream  : access Root_Stream_Type'Class;
    Item    : in Table) is
begin
-- Start the table.
String'Write(Stream, "<Table>" & New_Line);
-- Write out the rows.
Row'Write   (Stream, Item.Data );
-- End the table.
String'Write(Stream, "</Table>");
end Write;

End Tabling;
这不是很好很简单吗?好吧,这里是过于复杂和过于概括的部分:规范和实现

Tabling.ads

Pragma Ada_2012;
With Ada.Streams;
Generic
 Rows : Positive := 3;
 Cols : Positive := 4;
Package Tabling is 
-- Tables with rows or columns exceeding 200 are absurd, so we disallow them.
Maximum : constant:= 200;
Pragma Assert (Rows <= Maximum and Cols <= Maximum);

-- Table is a private entity.
Type Table is private;

-- Forward declaring the rows and columns here.
Type Col is private;
Type Row is private;
Private
Use Ada.Streams;

-- We are defining a type with elements of 'V' or 'M'.
Type Element_Type is ( 'M', 'V' );
-- We are declaring a stream writing function.
Procedure Write(
    Stream  : access Root_Stream_Type'Class;
        Item    : in Element_Type);
-- We are overriding the default write function with the one we defined.
For Element_Type'Write use Write;

-- Because we don't want an allocation wrror we restrict index-ranges to
-- a more reasonable value.
SubType Short_Positive is Positive Range Positive'First..Maximum;

-- We create subtypes representing the ranges that Rows or Columns take.
subtype column_index is Short_Positive Range Positive'First..Cols;
subtype row_index    is Short_Positive Range Positive'First..Rows;

-- Here we define stream-writing functions for rows and columns.
Procedure Write(
    Stream  : access Root_Stream_Type'Class;
    Item    : in Col);
Procedure Write(
    Stream  : access Root_Stream_Type'Class;
    Item    : in Row);
-- Here we override the stream-writing methods for rows and columns.
For Col'Write Use Write;
For Row'Write Use Write;

-- Here we finally define Rows and Columns.
Type Col is Array(column_index)of Element_Type;
Type Row is Array( row_index ) of Col;

-- THIS IS A STUB, SUBSTITUTED FOR YOUR CALL TO RANDOM.
Function RANDOM_CALL Return Element_Type is ( 'M' );

-- Finally we define the stream-writing for a table...
Procedure Write(
    Stream  : access Root_Stream_Type'Class;
    Item    : in Table);

-- and define what a table is...
Type Table is record
Data : Row:= ( others => (others => RANDOM_CALL) );
end record;
-- finishing off by assigning our write function to the type.
For Table'Write Use Write;  

End Tabling;

网格随机填充的程序体需要符合规范,即:

procedure Grid_Random_Fill(A : in out Grid);

正文不包括参数A。

解决方案将涉及两个嵌套循环,在您声明的数组中的二维范围内。

简单回答:

with Ada.Numerics.Discrete_Random;
with Ada.Text_Io;

procedure Main is

   type Cell_T is (M,V);
   type Rows_T is new Integer Range 1 .. 40;
   type Cols_T is new Integer Range 1 .. 80;
   type Grid_T is array (Rows_T,Cols_T) of Cell_T;
   package Rand is new Ada.Numerics.Discrete_Random (Cell_T);

   G : Rand.Generator;
   Grid : constant Grid_T := (others => (others => Rand.Random(G)));

begin

   for R in Rows_T'range loop
      for C in Cols_T'range loop
         Ada.Text_Io.Put (Cell_T'Image (Grid (R,C)));
      end loop;
      Ada.Text_Io.New_Line;
   end loop;

end Main;
输出:

$ ./main
VMMVVMMMVMMMVVVMMMVVVMMVVVMVVVVMMMMVMMMMVVMVMVVMMVMMMVVMMMMVMMVMMVMMMMVMMVVMVVMM
VVVMVVVVMMMMMMVVMVMMVMMMVMMMVVMVVVVVMVVVMVMVVVMVMVVVMVMMMVMVVVMVMMVVVMVVMVVVVVMM
VVMVVVVVVVMVVVVMVVVMVVMMVMVVVMVMMMVMMMVVVMMMVVVMMMMMVVVVMVMVVVVVVVMMVVMVMVMMVVVM
VMMVVMVMVVMVMVVMMVMMVMVVMVMVMMVVMMVVMMVMVVVVVVMVMVMMMMMMVMVVVMMVMMMMVMVVVVMVMVVM
VVVVMMMMMVVMMMMVVMMMVMMMVVMVVVMMMMMMVMVMMVMMVVVMMVMMMMVVMVMVMMMMVMMMVMVVVVMMMVMM
VMMVVMMMMMVVMMMVVVVMMVMMVVVVVVVVVVMVMVMVVVVVVVVMVMVMVVMVMMMMMVMMVVVVVVVVMVVVVVVV
VVMMMMVVVMMVMVMVMVVMMMMMVMVVVVMMVVMVVVMMMMMMMMMMMMMVMMVVMVVMVMMVMMMVVVMMMVVVMVVV
MVMVMMVMVVVMVVVVVVVMMMMVVVMMVVVMVMMVVMVVVMVMVMMMMVVVVMVVMMVMVMVVVMVMMVMMMVVMVVVV
MMVMMVMMMVVVVMVVVVVVVMVVVVMMMVMMMVMVMMMVMVVVMVMMVMVMVMVVMMMVVVVVMVVMVMVMVVMMMVVV
VVMMMMMMMVMVVMVMVVVMVVMVMMMMMVVVVVVVMVMMVVMMMMVVVMVVMVVMVVVVMMVVVVMMMMVMMVMMMMMM
VVVMMMMVMMVVVVVMVVMVVMVMMMMMMVMMMMVVMVVVMVMVVMMVVMMMVVMMMVMVVVVVMMVVVMVVVMMVVMMM
VMVVMMVMVVVMMMVVVVMMMMVVVMVVVVMMMVMVVVVMMMVVVMVVMMVVVMVMMMVMMVVVMVMMMMMMVMVVVMVV
VMVMMMVMMMVMMMMMMVMMMVVMMMMVMMMVVMMVMMMVVMVVVMMMMVMVMVMVVMMVMMMVVMVVMVMMMMVMVMMM
VMVVVMMMMMVMMMMVVVVMMMVVMMVVMVVMVMVVMVVVVMVMMVMMVMMVMVVMVVVVVVMMMMVMVMMMVVVMMVVV
VVMVVMVMVVVMMMMMVVVMVMVVMVMVMMVVVMVVMMVMMVMMVVMVMMMMVMVVMMMVVMVMMMMMMMMVMVMMVVVM
MVVVVVMMVVMMMVMVMVMVMVVMMMVVMMVMVMVVVMVVVVVMMMMVVVMVVMVVMVVVVVVVVMMVMMVVVVVVVVMV
MVMMMMVMMVVVVVMMMVMVVVMVVMVVMVVVVMVVVMVVMVVMMVVVMVMVVMMMVVMMMMVVMMMVMVMMMMVMMMVV
MVVMVMVVMMVMVMMVMVVVMVVVVVVVVVVVVMVMMVVMMVMMMVVVMMVMMMMVVMVMVMVMVMVVVMMMMVMVVVMM
MMVVVVVMVVMVMMVMMVVVVVMVMMMMMVVVVMVMVMMVVVMMMVMVVVMVMMMMVVMMVMVMVVVVMMMVMMMMVVMV
MMMVVMMMVMVVVVVMVMVMMVVVMVVMMVMVVMVVMVMMVMVVVVVVVMMMVVVMVVVVMVVVVVVMMMVVMMMMMMMV
VVMMVMMVMMMMVMVVVMMMMVVMVMVVMVVVMMMVMVMMMMMVMMVVMMMMVMVVMMMVMVMMMMVMMMMVVVMMMVMM
VMVVVMMVVVVVVMVMMMVVVMVMMVVMVVMVVVVVVVVMMMMMVVVMMMMVMVVVMVMVMMVVVMMVMMVMVMMVVVVV
MMVMMMVMVMVMMVVMMMMVMMVMVMMVVMMMVVVMVVVVVVVVMMMVMVVVMMMVMMVMMVMVMVMMMVVMMMMMVMMM
MMVVMMMMMVVMMMMVMVVMVVMVVVVVMVVVMVMMVMMVVMMMVVVMVVVVMVVMMVVMVVMMMVMVMVMVMVMMMMVM
MVMVVVVMMMVVMVVMMVMVVMVMVVVMMVMVMMMVMVMMMMMVMVMVVMMVMMMVMVMVVMMVMMMVVMVVVVVMVMVV
VMVVMMMVMVMMMMMMMMVVVMVMVVVVMVVVVVMVMVVMVMVVVVVMMVVVVVVMMMMMVVMVMVVVVMVMMMMVVVVM
MVMVMVMMMMVMMVVVMMMMMVMMVVMMMMVVVVVVVMMVVVVMMMMMVVMMVVMVVVVVMMMVVVVMVMVVVMMVMMVM
VVVVVMMMMVVMMMMVVMVVVMMVMMVMVVVVVMVVVVVMVMVVMMVVVMVVMMMVMVVVVMMMVVVMVVMVMVMMMMVV
MVVVMVMVMVMMMMMVMVMMVMMVVMVVVVMMVMVVMVVVMVMVMVMMVVVVMMVVMMMVVVMMMMMVVMMMMMVMVVVV
MVMVMMMVVVMVVVVVVMMVMVVVMMVMVMMVMMVMVVVMMMMVMMVMMVMMMMMMVMVVVMVMMVMVMMMVVMMMMVMV
VVMVVMVVMVMVMMMMVMVVVMMMMMVMMMMMMMVVVVVMMMVVVMVMMMMVVVMVMVMVVMMMVMMMMVMMMVMMMVMV
MMMMVMMVVVVMVVMMVMVVMVVVMVMMVVVMVVVMMVVVVVMMMVMVVVMMMMVVMVMMVMVMVMVMMMVMMVVVMMMM
VMMMMVVMMVMVMVVVVVMVVVMVMMMVVMMMVVMVVVMMMMVVVVMVMMVVMMVVVVMMMVMVMVVMVMMVMVMMMMMV
MMMMVMMMMMVMMVMMMVMVVMMVVVMVMMVVMVMVVMVVMMMMMVMVVVMVVMMVVVVMMMMMMMMVMVVVMVVMVMVV
VMMVMMMMMVMVMMMVVVVVMVMVMVMMVMVMVVVVVVVMMMMVVMMVVVMVVVMMMVVVMMVMMVVVMVVVMVMMMVMM
VMVMMVVVMVMMMMVVVMMVMMMVVVVMVMVVVMMVMMVMMVVVMMMMMVVVMVMMMMVVMVVVMVVMMMVMMMVMVVVM
VVVMMMVVMMMMMVMVVVMVVMVVVVVVMMMVVMVVMVVMVMVMVVVMVMMMMVMMMMMVMMMMVVMVVVVVVMVMMVMV
VVVVMVVVMVMMMMMMVVMVVVVVVMMMMMMVVMMMMVMMVMMVMMMVMVVMMMMMVMMMMMMMMVVVMMMMVVMVMVVM
MMVVVMVMVVMVVMVVVMMVVMVMVMMVMMMVMVMMMMMVVVMMMMVMMVMVVVVMVMMMMVVVMMMVVVMMMVMMMMMM
VMMVMMMVMVVMMVVVVMMVMMVVMVMVMMVMMMVMMVVMVVVVMVMVVVVMMMMMMMVVVMVMVMMVVVVMVMVMMMVV

天哪!这是什么,康普·朗·阿达?:-)哈哈-没有,但我一直在那里闲逛我确实警告过它过于复杂和过于笼统。你能看一下我的帖子吗,我已经编辑了它,并添加了一些信息-但还是有点丢失了..两项:1--你的子程序需要匹配,所以将主体更改为
过程网格\u随机填充(a:输入-输出网格)
和2--你有一个无限循环,并且没有触及网格参数。你似乎花了很多精力为此人编写代码(我假设为“他”),我认为这不会帮助他理解问题中的代码有什么问题。引用了一个相关的例子。“我无法编译它”通常是相当简单的。这是一个很好的形式,可以告诉我们你的编译器错误,而不是强迫想要回答你的人自己通过编译器来运行这个问题,或者尝试扮演“人类编译器”。你为什么在规范网格中调用枚举?这个名称显然意味着一个数组?TableauCell类型为81x41,而不是80x40。为什么Grid_Random_Fill(规范中的版本)采用Grid类型的参数-您肯定是指TableauCell?(也许你最初认为这两种类型相反,即TableauCell将是枚举。)你不认为主体中的网格随机填充应该与规范中的网格匹配吗?为什么你要在网格中声明一个类型生命?你肯定想使用规范中声明的网格?嗨,谢谢你的回复。以下是我到目前为止得到的:+1,但我高度怀疑编译器试图告诉OQ相同的信息。我认为你是对的。我只是想用户可能没有理解消息,因为错误没有在原始文件中更正。这就是我在对问题的评论中试图指出的。只要输入错误信息,他就可以为每个人节省很多打字时间。