Download Lists and Random Bricks

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

History of the function concept wikipedia , lookup

Central limit theorem wikipedia , lookup

Karhunen–Loève theorem wikipedia , lookup

Non-standard calculus wikipedia , lookup

Law of large numbers wikipedia , lookup

Dirac delta function wikipedia , lookup

Transcript
Random Bricks
Level 3 - Reading
Random Bricks: https://bricklayerdotorg.wordpress.com/generating-random-bricks/
Random Numbers
Random Numbers
• In this discussion we will ignore the idiosyncrasies surrounding how
computers represent real numbers and issues surrounding equality
comparisons.
• Virtually all programming languages provide a variety of ways to generate a
random (real) number that, mathematically speaking, is in the range
0.0 ≤ n < 1.0
• Note that, in this range, n can never equal 1.0, but can equal 0.0.
A Random Number Function
• To get a random number, one typically calls a special function. The basic random number
function is a nullary function. Its name can vary from language to language, but the
function is typically called random or rand.
• Let random denote a function that when called generates a random number in the range
0.0 ≤ n < 1.0
• Let us assume that random is a nullary function which can therefore be called as follows:
random ()
Simulating a Coin Flip
An Algorithm
The following algorithm shows how the random function can be used to simulate a
coin flip. In the algorithm below, H stands for “heads” and T stands for “tails”.
1. Let n = random ()
2. if n < 0.5 then print (“H”) else print (“T”)
This algorithm can be easily implemented in SML. An important question is: What
kind of output could one expect from a program that flipped a coin, say, 10 times?
• Would you expect 5 heads and 5 tails?
• Would you expect 10 heads and 0 tails?
An Experiment
• I conducted an experiment where I flipped an actual coin 10 times and got
the following sequence of heads (H) and tails (T).
HTTTTTHHHH
• One important thing to note about the sequence is that random does not
mean “evenly distributed”. For example, after seeing a sequence of 3 tails,
it is incorrect to assume that the next coin flip must yield heads.
• What would happen if I ran the experiment again? What would be the
chances (i.e., the odds) that same sequence of heads and tails would
occur?
Properties of a Random Function
Let us consider writing a program that conducts the coinflipping experiment on our behalf. What would you want to have
happen if you ran such a program twice?
• Would you want the program to produce the same output every time
it is executed? If not, how might this impact your ability to test the
program?
• Would you want the program to produce the same output if it is
executed on a different computer?
Simulating the Roll of a Die
An Algorithm
The following algorithm shows how the random function can be used to simulate the roll of a sixsided die. The basic idea here is to partition the range 0.0 ≤ n < 1.0 into six equal sections and
associate each section with (aka, map each section to) a side of the die.
1.
2.
3.
4.
5.
6.
7.
Let n = random ()
if 0.0/6.0 ≤ n < 1.0/6.0 then print (“1”)
else if 1.0/6.0 ≤ n < 2.0/6.0 then print (“2”)
else if 2.0/6.0 ≤ n < 3.0/6.0 then print (“3”)
else if 3.0/6.0 ≤ n < 4.0/6.0 then print (“4”)
else if 4.0/6.0 ≤ n < 5.0/6.0 then print (“5”)
else if 5.0/6.0 ≤ n < 6.0/6.0 then print (“6”)
This algorithm can also be easily implemented in SML.
An Experiment
• I conducted an experiment where I rolled an actual die 10 times and got
the following sequence of numbers.
3512152252
• Note that the numbers 4 and 6 never appeared. Does this imply that the
die is “loaded”? No.
• If I roll the die five more times, will I be guaranteed that 4 and/or 6 will
appear? No.
• It is important to appreciate that random number sequences have such
properties.
Bricklayer
A Random Brick Function
The generateRandomBrickFn function
• Bricklayer provides a function, called generateRandomBrickFn, that can be used to generate random bricks.
This function implements an algorithm similar to the coin-flipping and die-rolling algorithms described
previously.
• Let brickList denote a list of bricks.
• The evaluation of the expression generateRandomBrickFn brickList will produce a nullary function value as
its result.
• A val-declaration can be used to bind a variable (i.e., our desired function name) to this nullary function
value as follows.
val myName = generateRandomBrickFn brickList;
• The evaluation of the function call “myName ()” will return a brick, randomly selected from brickList.
Predefined Brick Lists
• Bricklayer provides a set of predefined brick lists that can be used to
generate random brick functions. This set includes the following brick lists.
•
•
•
•
•
•
•
•
•
grayscale
greenScale
blueScale
purpleScale
redScale
warmScale
brownScale
clearScale
allOneBitBricks
Example 1a
A one dimensional sequence of RED and BLACK bricks.
open Level_3;
val brickList
= [BLACK,RED];
val randomBrick = generateRandomBrickFn brickList;
fun sequence0 (x,z) =
let
val delta = 1;
val brick1 = randomBrick ();
val brick2 = randomBrick ();
in
put2D (1,1) brick1 (x + 0 * delta, z);
put2D (1,1) brick2 (x + 1 * delta, z)
end;
fun sequence1 (x,z) =
let
val delta = 2*1;
in
sequence0 (x + 0 * delta, z );
sequence0 (x + 1 * delta, z )
end;
fun sequence2 (x,z) =
let
val delta = 2*2*1;
in
sequence1 (x + 0 * delta, z );
sequence1 (x + 1 * delta, z )
end;
fun sequence3 (x,z) =
let
val delta = 2*2*2*1;
in
sequence2 (x + 0 * delta, z );
sequence2 (x + 1 * delta, z )
end;
fun sequence4 (x,z) =
let
val delta = 2*2*2*2*1;
in
sequence3 (x + 0 * delta, z );
sequence3 (x + 1 * delta, z )
end;
build2D (32,32);
sequence4 (0,0);
show2D "random in 1D";
Question: In what order are these bricks “put”?
Question: How can we confirm this?
Example 1b
Tracing a one dimensional sequence of RED and BLACK bricks.
fun showPoint (x,z) =
let
val pointStr = "(" ^ Int.toString x ^ "," ^ Int.toString z ^ ")";
in
print("\n(x,z) = " ^ pointStr)
end;
fun random1D p =
(
print "\n\n";
sequence4 (0,0);
print "\n\n"
fun myPut dim brick p =
(
showPoint p;
put2D dim brick p
);
fun sequence0 (x,z) =
let
val delta = 1;
val brick1 = randomBrick ();
val brick2 = randomBrick ();
in
myPut (1,1) brick1 (x + 0 * delta, z);
myPut (1,1) brick2 (x + 1 * delta, z)
end;
);
build2D (32,32);
random1D (0,0);
show2D "random in 1D";
Example 2
A four-colored two dimensional random brick sequence.
open Level_3;
val brickList
= [RED, GREEN, YELLOW, BLUE];
val randomBrick = generateRandomBrickFn brickList;
fun board0 (x,z) =
let
val delta = 1;
val brick1 = randomBrick ();
val brick2 = randomBrick ();
val brick3 = randomBrick ();
val brick4 = randomBrick ();
in
put2D (1,1) brick1 (x
,z
);
put2D (1,1) brick2 (x + delta, z
);
put2D (1,1) brick3 (x + delta, z + delta);
put2D (1,1) brick4 (x
, z + delta)
end;
fun board1 (x,z) =
let
val delta = 2*1;
in
board0 (x
,z
);
board0 (x + delta, z
);
board0 (x + delta, z + delta);
board0 (x
, z + delta)
end;
fun board2 (x,z) =
let
val delta = 2*2*1;
in
board1 (x
,z
);
board1 (x + delta, z
);
board1 (x + delta, z + delta);
board1 (x
, z + delta)
end;
fun board3 (x,z) =
let
val delta = 2*2*2*1;
in
board2 (x
,z
);
board2 (x + delta, z
);
board2 (x + delta, z + delta);
board2 (x
, z + delta)
end;
build2D (32,32);
board3 (0,0);
show2D "random 2D";
Question: In what order are these bricks “put”?
Question: How can we confirm this?
The End