In this section we are interested in looking into the process of random number generation in computer systems. Though this may not seem too obvious, computers do not priduce trul random numbers. This is because, a computer by virtue of it’s very design is quite deterministic. I mean to say that the process by which a computer/process generates random numbers will be transigent on the underlying algorithm. So, if one can beat the algorith, one can always realise the generated numbers.

I remember once watching an online lecture from MITCourseware, with the professor giving a lecture on “Stochastic Processes”. He was narrating a story of his time in an investment firm in the 80’s when computers were only beggining to be utilized en masse in firms. A fellow colleague was playing around on one of them and was plotting random process as graphs. The professor narrating the story was telling the class that when he attempted the same (plotting random processes) on another system, seeing the same graph on both systems, he remarked that he thought he’d broken through the fifth dimension.

Of course, I mention this story only to emphasise that the number generation done by systems is deterministic and dependent on the underlying algorithm. As a result this is called a ’Pseudo Random Number Generator“. This will be important to keep in mind as we go through the rest of the textbook.

1. Linear Congruential Generator

We’ll first look into a very basic random number generator called the Linear Congruential Generator. This is now a primitive algortihm, but it serves as a good starting point for purely educational purposes. Understaing the basic notion of pseudo number generation, will at a later point enable us to encode complex(not necessarily difficult) methodologies. The basic algorithm is given below:

1.1 Algorithm

input:

m > 1(modulus)

a \(\in\) {1,2…m-1} (multiplier)

c \(\in\) {0,1…m-1} (increment)

X0 \(\in\) {0,1…m-1} (Random seed)

output:

a sequence of random numbers X1, X2, X3…:

1.for n = 1, 2, 3…do

2.Xn = (a**X(n-1)+c) mod m*

3.output Xn

4.end for

LCG <- function(n,m,a,c,X0){
  X <- numeric(length=n)
  Xn <- X0
  for (i in 1:n){
    Xn <- (a*Xn + c) %% m
    X[i] <- Xn
  }
  return(X)
} 

Output

LCG(10,8,5,1,0) \(\newline\) [1] 1 6 7 4 5 2 3 0 1 6

As mentioned in the algorithm, a numeric vector is fed through a linear equation and the result is the random number we get as the output. This is awfully simplistic. Further reasons as to why this is ineffective and roundly dismissed for any practical purposes will be discusse din the next post. @fenner2012a says

References

LS0tDQp0aXRsZTogIkludHJvZHVjdGlvbiB0byBTdGF0aXN0aWNhbCBDb21wdXRhdGlvbiINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBtYXRoamF4OiBsb2NhbA0KICAjcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIHNlbGZfY29udGlhbmVkOiBubw0KICBmb250c2l6ZTogMTFwdA0KICBnZW9tZXRlcnk6IG1hcmdpbj0xaW4NCiAgY2l0YXRpb25fcGFja2FnZTogbmF0YmliDQogIGNvZGVfZm9sZGluZzogc2hvdw0KICByZWZlcmVuY2VzOg0KICAtaWQ6IGZlbm5lcjIwMTJhDQogIHRpdGxlOiBPbmUtY2xpY2sgc2NpZW5jZSBtYXJrZXRpbmcNCiAgYXV0aG9yOg0KICAtIGZhbWlseTogRmVubmVyDQogICAgZ2l2ZW46IE1hcnRpbg0KICBjb250YWluZXItdGl0bGU6IE5hdHVyZSBNYXRlcmlhbHMNCiAgdm9sdW1lOiAxMQ0KICBVUkw6ICdodHRwOi8vZHguZG9pLm9yZy8xMC4xMDM4L25tYXQzMjgzJw0KICBET0k6IDEwLjEwMzgvbm1hdDMyODMNCiAgaXNzdWU6IDQNCiAgcHVibGlzaGVyOiBOYXR1cmUgUHVibGlzaGluZyBHcm91cA0KICBwYWdlOiAyNjEtMjYzDQogIHR5cGU6IGFydGljbGUtam91cm5hbA0KICBpc3N1ZWQ6DQogICAgeWVhcjogMjAxMg0KICAgIG1vbnRoOiAzDQogICAgYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFwaHkuYmliDQotLS0NCkluIHRoaXMgc2VjdGlvbiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBsb29raW5nIGludG8gdGhlIHByb2Nlc3Mgb2YgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGluIGNvbXB1dGVyIHN5c3RlbXMuIFRob3VnaCB0aGlzIG1heSBub3Qgc2VlbSB0b28gb2J2aW91cywgY29tcHV0ZXJzIGRvIG5vdCBwcmlkdWNlIHRydWwgcmFuZG9tIG51bWJlcnMuIFRoaXMgaXMgYmVjYXVzZSwgYSBjb21wdXRlciBieSB2aXJ0dWUgb2YgaXQncyB2ZXJ5IGRlc2lnbiBpcyBxdWl0ZSBkZXRlcm1pbmlzdGljLiBJIG1lYW4gdG8gc2F5IHRoYXQgdGhlIHByb2Nlc3MgYnkgd2hpY2ggYSBjb21wdXRlci9wcm9jZXNzIGdlbmVyYXRlcyByYW5kb20gbnVtYmVycyB3aWxsIGJlIHRyYW5zaWdlbnQgb24gdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtLiBTbywgaWYgb25lIGNhbiBiZWF0IHRoZSBhbGdvcml0aCwgb25lIGNhbiBhbHdheXMgcmVhbGlzZSB0aGUgZ2VuZXJhdGVkIG51bWJlcnMuDQoNCkkgcmVtZW1iZXIgb25jZSB3YXRjaGluZyBhbiBvbmxpbmUgbGVjdHVyZSBmcm9tIE1JVENvdXJzZXdhcmUsIHdpdGggdGhlIHByb2Zlc3NvciBnaXZpbmcgYSBsZWN0dXJlIG9uICJTdG9jaGFzdGljIFByb2Nlc3NlcyIuIEhlIHdhcyBuYXJyYXRpbmcgYSBzdG9yeSBvZiBoaXMgdGltZSBpbiBhbiBpbnZlc3RtZW50IGZpcm0gaW4gdGhlIDgwJ3Mgd2hlbiBjb21wdXRlcnMgd2VyZSBvbmx5IGJlZ2dpbmluZyB0byBiZSB1dGlsaXplZCBlbiBtYXNzZSBpbiBmaXJtcy4gQSBmZWxsb3cgY29sbGVhZ3VlIHdhcyBwbGF5aW5nIGFyb3VuZCBvbiBvbmUgb2YgdGhlbSBhbmQgd2FzIHBsb3R0aW5nIHJhbmRvbSBwcm9jZXNzIGFzIGdyYXBocy4gVGhlIHByb2Zlc3NvciBuYXJyYXRpbmcgdGhlIHN0b3J5IHdhcyB0ZWxsaW5nIHRoZSBjbGFzcyB0aGF0IHdoZW4gaGUgYXR0ZW1wdGVkIHRoZSBzYW1lIChwbG90dGluZyByYW5kb20gcHJvY2Vzc2VzKSBvbiBhbm90aGVyIHN5c3RlbSwgc2VlaW5nIHRoZSBzYW1lIGdyYXBoIG9uIGJvdGggc3lzdGVtcywgaGUgcmVtYXJrZWQgdGhhdCBoZSB0aG91Z2h0IGhlJ2QgYnJva2VuIHRocm91Z2ggdGhlIGZpZnRoIGRpbWVuc2lvbi4NCg0KT2YgY291cnNlLCBJIG1lbnRpb24gdGhpcyBzdG9yeSBvbmx5IHRvIGVtcGhhc2lzZSB0aGF0IHRoZSBudW1iZXIgZ2VuZXJhdGlvbiBkb25lIGJ5IHN5c3RlbXMgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgZGVwZW5kZW50IG9uIHRoZSB1bmRlcmx5aW5nIGFsZ29yaXRobS4gQXMgYSByZXN1bHQgdGhpcyBpcyBjYWxsZWQgYSAnUHNldWRvIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIi4gVGhpcyB3aWxsIGJlIGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgYXMgd2UgZ28gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgdGV4dGJvb2suDQoNCiMgMS4gTGluZWFyIENvbmdydWVudGlhbCBHZW5lcmF0b3INCldlJ2xsIGZpcnN0IGxvb2sgaW50byBhIHZlcnkgYmFzaWMgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2FsbGVkIHRoZSAqTGluZWFyIENvbmdydWVudGlhbCBHZW5lcmF0b3IqLiBUaGlzIGlzIG5vdyBhIHByaW1pdGl2ZSBhbGdvcnRpaG0sIGJ1dCBpdCBzZXJ2ZXMgYXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBwdXJlbHkgZWR1Y2F0aW9uYWwgcHVycG9zZXMuIFVuZGVyc3RhaW5nIHRoZSBiYXNpYyBub3Rpb24gb2YgcHNldWRvIG51bWJlciBnZW5lcmF0aW9uLCB3aWxsIGF0IGEgbGF0ZXIgcG9pbnQgZW5hYmxlIHVzIHRvIGVuY29kZSBjb21wbGV4KG5vdCBuZWNlc3NhcmlseSBkaWZmaWN1bHQpIG1ldGhvZG9sb2dpZXMuIFRoZSBiYXNpYyBhbGdvcml0aG0gaXMgZ2l2ZW4gYmVsb3c6DQoNCiMjMS4xIEFsZ29yaXRobQ0KKippbnB1dCoqOg0KDQoqbSogPiAxKG1vZHVsdXMpDQoNCiphKiAkXGluJCB7MSwyLi4uKm0qLTF9ICoobXVsdGlwbGllcikqDQoNCipjKiAkXGluJCB7MCwxLi4uKm0qLTF9ICooaW5jcmVtZW50KSoNCg0KKlgqfjB+ICRcaW4kIHswLDEuLi4qbSotMX0gKihSYW5kb20gc2VlZCkqDQoNCioqb3V0cHV0Kio6DQoNCiBhIHNlcXVlbmNlIG9mIHJhbmRvbSBudW1iZXJzICpYKn4xfiwgKlgqfjJ+LCAqWCp+M34uLi46DQogDQoxLioqZm9yKiogKm4qID0gMSwgMiwgMy4uLioqZG8qKg0KDQoyLipYKn5ufiA9IChhKipYKn4obi0xKX4rYykgbW9kICptKg0KDQozLm91dHB1dCAqWCp+bn4NCg0KNC5lbmQgKipmb3IqKg0KDQpgYGB7cn0NCkxDRyA8LSBmdW5jdGlvbihuLG0sYSxjLFgwKXsNCiAgWCA8LSBudW1lcmljKGxlbmd0aD1uKQ0KICBYbiA8LSBYMA0KICBmb3IgKGkgaW4gMTpuKXsNCiAgICBYbiA8LSAoYSpYbiArIGMpICUlIG0NCiAgICBYW2ldIDwtIFhuDQogIH0NCiAgcmV0dXJuKFgpDQp9IA0KYGBgDQoNCiMjIE91dHB1dA0KPiBMQ0coMTAsOCw1LDEsMCkgJFxuZXdsaW5lJA0KIFsxXSAgICAgICAgIDEgNiA3IDQgNSAyIDMgMCAxIDYNCg0KQXMgbWVudGlvbmVkIGluIHRoZSBhbGdvcml0aG0sIGEgbnVtZXJpYyB2ZWN0b3IgaXMgZmVkIHRocm91Z2ggYSBsaW5lYXIgZXF1YXRpb24gYW5kIHRoZSByZXN1bHQgaXMgdGhlIHJhbmRvbSBudW1iZXIgd2UgZ2V0IGFzIHRoZSBvdXRwdXQuIFRoaXMgaXMgYXdmdWxseSBzaW1wbGlzdGljLiBGdXJ0aGVyIHJlYXNvbnMgYXMgdG8gd2h5IHRoaXMgaXMgaW5lZmZlY3RpdmUgYW5kIHJvdW5kbHkgZGlzbWlzc2VkIGZvciBhbnkgcHJhY3RpY2FsIHB1cnBvc2VzIHdpbGwgYmUgZGlzY3Vzc2UgZGluIHRoZSBuZXh0IHBvc3QuIEBmZW5uZXIyMDEyYSBzYXlzDQoNCiMgUmVmZXJlbmNlcw0K