Random numbers. Why random numbers? A random number is one of the easiest way to make a decision in...
-
Upload
annabelle-simmons -
Category
Documents
-
view
216 -
download
0
Transcript of Random numbers. Why random numbers? A random number is one of the easiest way to make a decision in...
Random numbers
Why random numbers?
• A random number is one of the easiest way to make a decision in a game
• The player may see it as random, or try to guess the reasoning behind your choice!
• Sometimes, games mix logical AI with some randomness to introduce surprises and reduce predictability
• Later we can see how randomness may be shaped
The m-sequence
• The maximum length binary sequence may be generated in hardware or in machine code
• It is made from shift-registers and exclusive-or function(s)
• On a clock event, a shift register will transfer its input to its output and hold it there until the next clock pulse
The m-sequence
• An exclusive-or function will output a binary one if its inputs are different.
• If presented with two ones or two zeroes, the output will be zero (this is called modulo-two addition)
• Now let’s see a circuit:
The m-sequence (copy this down)
a0a1a2a3
b0b1b2b3(1)(2)(4)(8)
The m-sequence
• We start off by “seeding” the circuit with all ones on the outputs of the single-bit memories.
• The input of the exclusive-or gate has two ones on it, so the output is zero.
• The output of the circuit is 1+2+4+8 = 15• On the next clock pulse, inputs become
outputs. Output b3 becomes zero. Circuit output becomes 1+2+4+0 = 7
The m-sequence
• Easy exercise:
• Please work out the 15 numbers in the sequence, until it starts to repeat.
• Then work out what would happen if we stupidly seed it with all zeroes and start it off.
• (5 mins)
The m-sequence
• Now you know what we’re talking about, let’s talk about it....
• It goes through every possible number except 0.
• The sequence is (2n -1) long. Here we have 4 shift-registers, 24-1 = 15. So with only 16 shift registers we can have a sequence of 216-1 = 65535. It’s extremely efficient
The m-sequence
• Balance property: All numbers (except zero) occur only once.
• The probability of any number (except zero) is the same.
• Statistically it is smoother than a really random function.
• This is the mechanism used in most random number generation in calculators and languages
The m-sequence
• The sequence is fixed – these are not random numbers, they are pseudorandom numbers.
• The generator is sometimes run until interrupted by an external event (e.g. me pressing a key), making the next number unpredictable.
• If we always seed using the same number, the sequence will always be the same (e.g. for debugging)
• Many languages seed using the system clock
Random numbers in high level languages
• “C” has:• rand() – Produces a random integer• srand() – Sets up a seed for rand()
• The ANSI C standard only states that rand() is a random number generator which generates integers in the range [0,RAND_MAX] inclusive, with RAND_MAX being a value defined in stdlib.h, and RAND_MAX being at least 32767 (= 215 – 1).
Random numbers in high level languages
• Dice – a bad algorithm: seed = time(NULL);srand(seed); i = (rand() % 6) + 1;
// % 6 means modulo 6, // ie the remainder when the // number is divided by 6. // This is not the best way
Random numbers in high level languages
• Dice – a better algorithm: seed = time(NULL);srand(seed);
x := ((rand()/(RAND_MAX+1)); y := (x * 6) + 1; i = int(y);
// x is a float between 0 and 0.999 // y is a float between 1 and 5.999 // i is the dice output // I could have done this in one line
Random numbers in high level languages
• Many languages have a floating point random() function, which returns a value between 0 and 1.
• In C we can produce one by:
r = ((double)rand() / ((double)(RAND_MAX)+(double)(1)));
• Let us assume that we have such a function.
Exercise - Probability Densities
• I throw a coin three times. What is the chance of:
• Three heads?
• Two heads and a tail?
Probability Densities
Pro
babi
lity
Number/Enumeration
Coins
M-Sequence
3 2+1 31+2
Decisions using random numbers
• The Boxer:
• The boxer can use a Jab (j), an Uppercut (u), a Cross (c) or a Hook (h)
• In this first example, we want all to be equally likely:
The Boxer
x := int(4*Random());SELECT CASE (x) CASE (0) move := “j” CASE (1) move := “u” CASE (2) move := “c” CASE default move := “h”END SELECT
The Boxer
• In real life a boxer would use a jab far more often than any other move
• So we assign our probability space accordingly. for r being a random number in the range 0-1.0:– 0... 0.4 means Jab– 0.4... 0.6 means uppercut– 0.6... 0.8 means cross– 0.8... 1.0 means hook
The Boxer
• What have we just done?
• We’ve used a random number generator to “decide” on an AI opponent’s next move.
• We’ve adjusted the probabilities so that the choice of move is more realistic.
Star Field Generation
• In Elite, there was a 2-D star-field
• The field was based on an N x N grid
• Whether there was a star in a cell or not was decided by a seeded random number generator
Star := 0;
IF (random() < 0.1 THEN Star := 1;
Star Field Generation
• Why was the random number seeded?• Well, the BBC Microcomputer only had
32k of memory.• Since the generator was seeded, it
produced the same result every time it ran• So we didn’t need to store the star map in
memory – we just ran the procedure.• A similar seeded procedure decided on
the planets around the stars
Terrain
• We need to generate terrain for a landscape in which our hero is to fight
• We don’t especially want to specify and remember the whole world – it’s easier if we can generate it on the fly, like our star map
• There are a number of ways of doing this
Terrain
• A crude way:
FOR each square in the grid Height = max_height * random()
• Unfortunately, this produces a totally unrealistic landscape – the world wasn’t made that way!
Terrain
• The random grid could be cleaned up by constraining the maximum height difference between neighbouring cells
• Since the top and left cells are filled in first, this results in ridges running diagonally top left – to – bottom right
• Nevertheless, it sort-of works
Terrain
• In the PARTICLE DEPOSITION method, grains are dropped onto random points on the grid
• The coordinates of the drop point are decided by running the random number generator twice.
• There is a preset maximum height difference between cells
• If the landing of a grain causes the height difference to a neighbouring cell to exceed the maximum, the higher grain “rolls” into the lower cell.
• Having rolled, the algorithm assesses whether it still needs to roll one more cell, and does this if necessary
Terrain
• A simple algorithm is to use the star-field algorithm to allocate the positions of hills.
• The hills have a standard height, width and shape
• The shape is usually a raised cosine function
• The height at any point is the sum of the heights contributed by any overlapping hill(s)
Terrain
Overlapping hills
Background Sound
• Background game music (extra-diegetic music) is usually looped because we don’t know how long the scene will last.
• However, soundscapes cannot be looped for long. After a while you can predict the arrival of the cockerel’s crow (again!)
• (Your best bet with a looped soundscape is to make it complicated and long)
Background Sound
• A better solution is the GRANULAR SOUND SYNTHESIS technique, where sound effects are added at random with a certain probability.
• Sound effects may be randomly altered also: pitch and playback speed may be altered to hide the fact that they have the same source.
Chip Music Percussion
• When there is a game sound chip (Gameboy), percussion is often generated using filtered white noise.
• Digital white noise is a random sequence of numbers.
• This is usually generated on-chip using an M-sequence generator programmed into the hardware.