Random numbers in C++
Download
Report
Transcript Random numbers in C++
Random numbers in
Python
Nobody knows what’s next...
Deterministic machines
That means that computers do the same
predictable thing every time you give them
the same instructions
we WANT this – we don't want random
happenings - most of the time
when would you NOT want this?
games
of reality – traffic flows, nuclear
explosions, star formation
Cryptography!
simulations
What is "random"?
A “real” random number is generated by a
real world event like an atom decaying or
not in a certain time
Hard to do that in a computer
Best we can do with a deterministic
machine is make “pseudorandom”
numbers
They are “good enough”
“good enough”?
A “good” random number is one that is
distributed evenly in its range
If you were rolling a die, you want
numbers from 1 to 6 to be equally likely to
show up
This is over the “long run”, not each
individual trial
Lots of research
Lots has been done on random numbers
Trying to get faster algorithms
With larger cycles – all algorithms will
eventually start repeating but the best
ones not before a few million numbers at
least
Very heavy statistics and mathematics in
the latest algorithms
A simple one – “mid square”
Take a number to start with (the “seed”)
Square it
Take the “middle” of it – trim off some
digits at front and end
That’s the random number
Repeat the process by feeding the number
just generated back in as the starting
number next time
An example
12345 squared = 152399025
chop it off and get 23990
23990 squared = 575520100
chop it off and get 55201
55201 squared = 3047150401
chop it off and get 47150
And so on
Properties of an RNG
Give the algorithm a DIFFERENT seed to
start with and what comes out?
Give the algorithm the SAME seed to start
with and what comes out?
Syntax
from random import *
Use seed(x) to set the initial seed (x is
usually an integer)
randrange(stop) gets random integer from
0 to stop-1
randrange(start,stop) to get random
integer number from start to stop-1,
inclusive
Syntax
Use randrange(start, stop, step) to get
random numbers from start to stop-1, with
a step size
Use random() to get a floating point
number in the range [0.0, 1.0) (meaning
that it may generate 0, it will not generate
1.0) (useful for probabilities, 0 means “will
not happen”, 1 means “certain to happen”)
Seeds to start with
seed(23) will always give you the same
sequence of random numbers – good
when testing!
Asking the user for a number and then
using it as the seed - works but is a bit
aggravating to the user
If you don’t set seed at all, will use system
time – different for every run
Examples
choose a random word from a list
words = [“cat”, “hat”, “fox”, “house”, ”red”]
print(words[randrange(len(words))])
roll some dice
for i in range(10):
print (randrange(1,7), randrange(1,7))