生成包含随机元素的表

时间:2012-11-11 13:00:24

标签: 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;

和随机化:

    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到我的表中。我不确定我是否清楚,我不熟悉编码。

5 个答案:

答案 0 :(得分:4)

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

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

声明该类型的80x40数组。

使用该类型实例化Ada.Numerics.Discrete_Random

迭代数组边界,通过调用随机数字包的Random()函数设置每个数组元素。

答案 1 :(得分:2)

由于这有一种家庭作业的感觉,一个过于复杂,过于笼统的例子怎么样? 一切都有效,除了随机化,这是一个留给读者的练习。

Test_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;

现在不是那么美好而简单吗?好吧,这是过于复杂的&过度概括的部分:规范和实施!

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;

Tabling.adb

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;

答案 2 :(得分:2)

Grid_Random_Fill的过程体需要与规范一致,即:

procedure Grid_Random_Fill(A : in out Grid);

正文不包含参数A.

答案 3 :(得分:1)

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

答案 4 :(得分:1)

简单的回答:

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