Velocity Reviews > Math.random()

# Math.random()

Thomas Mlynarczyk
Guest
Posts: n/a

 02-16-2004
I remember there is a programming language where you can initialize the
random number generator, so that it can - if you want - give you the exactly
same sequence of random numbers every time you initialize it with the same
parameter. Can this be done with JavaScript? I couldn't find anything in the
documentation. Basically, what I want to achieve is to obtain always the
same sequence of random numbers for the same given initialization value (but
of course different sequences for different init values).

Can this be done in JavaScript?

Greetings,
Thomas

lallous
Guest
Posts: n/a

 02-16-2004
Hello

AFAIK, This cannot be done w/ JavaScript, but allowed with languages such as
C, Pascal, ...

To solve your problem, write your own random and randomize functions as:

var randSeed = 1234; // initial seed
function randomize()
{
// use math.random() to generate a random number and assign to initial
seed
}

function random()
{
randSeed = (randSeed * 1232) + (randSeed % 212) - randSeed & 0xFA11;
// put any forumla you want....i am not an export at writing pseudo number
generators functions
}

To generate same sequence:
randSeed = 232; // your initial seed
for (i=0;i<10;i++)
document.write(random() + "<br>"); // this will generate same sequence!

To generate a new sequence everytime, call randomize() or simply init
randSeed variable to a value of your choice.

HTH,
Elias
"Thomas Mlynarczyk" <(E-Mail Removed)> wrote in message
news:c0qahd\$e4v\$03\$(E-Mail Removed)-online.com...
> I remember there is a programming language where you can initialize the
> random number generator, so that it can - if you want - give you the

exactly
> same sequence of random numbers every time you initialize it with the same
> parameter. Can this be done with JavaScript? I couldn't find anything in

the
> documentation. Basically, what I want to achieve is to obtain always the
> same sequence of random numbers for the same given initialization value

(but
> of course different sequences for different init values).
>
> Can this be done in JavaScript?
>
> Greetings,
> Thomas
>
>
>

Dr John Stockton
Guest
Posts: n/a

 02-16-2004
JRS: In article <c0qd9i\$18d6n1\$(E-Mail Removed)-berlin.de>, seen in
news:comp.lang.javascript, lallous <(E-Mail Removed)> posted at Mon, 16
Feb 2004 14:26:56 :-

Responses should go after trimmed quotes, as per FAQ; corrected.

>"Thomas Mlynarczyk" <(E-Mail Removed)> wrote in message
>news:c0qahd\$e4v\$03\$(E-Mail Removed)-online.com...
>> I remember there is a programming language where you can initialize the
>> random number generator, so that it can - if you want - give you the

>exactly
>> same sequence of random numbers every time you initialize it with the same
>> parameter. Can this be done with JavaScript? I couldn't find anything in

>the
>> documentation. Basically, what I want to achieve is to obtain always the
>> same sequence of random numbers for the same given initialization value

>(but
>> of course different sequences for different init values).
>>
>> Can this be done in JavaScript?

>AFAIK, This cannot be done w/ JavaScript, but allowed with languages such as
>C, Pascal, ...

It is not necessarily a matter of the language, but may be just of the
implementation of the language library. If anyone here is writing a new
ECMA-262, then the random seed needs to be made a read/write variable.
In test, it is useful for randoms to be reproducible.

>To solve your problem, write your own random and randomize functions as:
>
>var randSeed = 1234; // initial seed
>function randomize()
>{
> // use math.random() to generate a random number and assign to initial
>seed
>}
>
>function random()
>{
> randSeed = (randSeed * 1232) + (randSeed % 212) - randSeed & 0xFA11;
> // put any forumla you want....i am not an export at writing pseudo number
>generators functions
>}

Nor an expert at spelling; but, from TZ +0200, that is not important.

Donald E Knuth wrote :- "Random numbers should not be generated with a
method chosen at random". Choice of a good algorithm is non-trivial,
except for those willing to look up available resources rather than
reinvent the wheel themselves.

See
<URL:http://www.merlyn.demon.co.uk/pas-rand.htm>
<URL:http://www.merlyn.demon.co.uk/js-randm.htm>
and Knuth's volumes.

The following are reported good (X[n] are successive RandSeed) :-

X[n+1] = 134775813*X[n] + 1 (mod 2^32)
X[n+1] = 1664525*X[n] + 1013904223 (mod 2^32)

Divide by 2^32, of course.

The expression of lallous is, in fact, remarkably bad; initialised with
1234, it immediately enters a cycle of length 4. With 1, it soon
reaches a cycle of length 2.

0xFA11 = 1111 1010 0001 0001, with 8 bits set; we have, in effect, an
8-bit seed and a maximum cycle length of 256.

--
<URL:http://jibbering.com/faq/> Jim Ley's FAQ for news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.

Thomas Mlynarczyk
Guest
Posts: n/a

 02-16-2004
Also sprach lallous:

> AFAIK, This cannot be done w/ JavaScript

((

> randSeed = (randSeed * 1232) + (randSeed % 212) - randSeed & 0xFA11;
> // put any forumla you want....i am not an export at writing pseudo
> number generators functions

Well, I don't need anything statistically sophisticated. The background is,
I'm programming a game and need to lay out some cards in a random order to
start playing. Now I want to be able to get back to the same layout later by
simply selecting "game number 12345", where 12345 will be the seed that
should always generate the same deck of cards. Currently I shuffle the cards
by selecting two at random and swapping their places. This I do a number of
times, so more or less all the cards should be randomly displaced.

lallous
Guest
Posts: n/a

 02-17-2004
Dr John Stockton <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)>...
> JRS: In article <c0qd9i\$18d6n1\$(E-Mail Removed)-berlin.de>, seen in
> news:comp.lang.javascript, lallous <(E-Mail Removed)> posted at Mon, 16
> Feb 2004 14:26:56 :-
>
> Responses should go after trimmed quotes, as per FAQ; corrected.
>
> >"Thomas Mlynarczyk" <(E-Mail Removed)> wrote in message
> >news:c0qahd\$e4v\$03\$(E-Mail Removed)-online.com...
> >> I remember there is a programming language where you can initialize the
> >> random number generator, so that it can - if you want - give you the

> exactly
> >> same sequence of random numbers every time you initialize it with the same
> >> parameter. Can this be done with JavaScript? I couldn't find anything in

> the
> >> documentation. Basically, what I want to achieve is to obtain always the
> >> same sequence of random numbers for the same given initialization value

> (but
> >> of course different sequences for different init values).
> >>
> >> Can this be done in JavaScript?

>
> >AFAIK, This cannot be done w/ JavaScript, but allowed with languages such as
> >C, Pascal, ...

>
> It is not necessarily a matter of the language, but may be just of the
> implementation of the language library. If anyone here is writing a new
> ECMA-262, then the random seed needs to be made a read/write variable.
> In test, it is useful for randoms to be reproducible.
>
>
>
> >To solve your problem, write your own random and randomize functions as:
> >
> >var randSeed = 1234; // initial seed
> >function randomize()
> >{
> > // use math.random() to generate a random number and assign to initial
> >seed
> >}
> >
> >function random()
> >{
> > randSeed = (randSeed * 1232) + (randSeed % 212) - randSeed & 0xFA11;
> > // put any forumla you want....i am not an export at writing pseudo number
> >generators functions
> >}

>
>
> Nor an expert at spelling; but, from TZ +0200, that is not important.

I learned my english through programming...so no wonder if tech words
come to mind and fingers first!

>
> Donald E Knuth wrote :- "Random numbers should not be generated with a
> method chosen at random". Choice of a good algorithm is non-trivial,
> except for those willing to look up available resources rather than
> reinvent the wheel themselves.
>
> See
> <URL:http://www.merlyn.demon.co.uk/pas-rand.htm>
> <URL:http://www.merlyn.demon.co.uk/js-randm.htm>
> and Knuth's volumes.
>
> The following are reported good (X[n] are successive RandSeed) :-
>
> X[n+1] = 134775813*X[n] + 1 (mod 2^32)
> X[n+1] = 1664525*X[n] + 1013904223 (mod 2^32)
>
> Divide by 2^32, of course.
>
> The expression of lallous is, in fact, remarkably bad; initialised with
> 1234, it immediately enters a cycle of length 4. With 1, it soon
> reaches a cycle of length 2.

Yes, I am aware of that, I was just trying to indicate how to create
own random function with a seed variable.

>
> 0xFA11 = 1111 1010 0001 0001, with 8 bits set; we have, in effect, an
> 8-bit seed and a maximum cycle length of 256.

--
Elias

Dr John Stockton
Guest
Posts: n/a

 02-17-2004
JRS: In article <c0r8gf\$fsb\$01\$(E-Mail Removed)-online.com>, seen in
news:comp.lang.javascript, Thomas Mlynarczyk
<(E-Mail Removed)> posted at Mon, 16 Feb 2004 21:16:45 :-
>Also sprach lallous:

>Well, I don't need anything statistically sophisticated. The background is,
>I'm programming a game and need to lay out some cards in a random order to
>start playing. Now I want to be able to get back to the same layout later by
>simply selecting "game number 12345", where 12345 will be the seed that
>should always generate the same deck of cards. Currently I shuffle the cards
>by selecting two at random and swapping their places. This I do a number of
>times, so more or less all the cards should be randomly displaced.

Your shuffling is, therefore, very probably not enough to achieve full
randomness, or more than is necessary to achieve full randomness, or
does not give equal probability to all possible results (assuming, that
is, a perfect Random function).

By reading the FAQ and following its "shuffling" reference, you could
have found

function Shuffle(Q) { var R, T, J
for (J=Q.length-1 ; J>0 ; J--)
{ R=Random(J+1) ; T=Q[J] ; Q[J]=Q[R] ; Q[R]=T }
return Q }

which is AFAICS the best possible Shuffle.

However, for your stated purpose, you do not need a Shuffle, but can do
a Deal which generates 0..N-1 in random order

function Deal(N) { var J, K, Q = new Array(N)
for (J=0; J<N; J++) { K = Random(J+1) ; Q[J] = Q[K] ; Q[K] = J }
return Q }

The best choice depends on how you represent the cards by variables.

--
<URL:http://jibbering.com/faq/> Jim Ley's FAQ for news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.

Thomas Mlynarczyk
Guest
Posts: n/a

 02-17-2004
Strange... I had posted this before, but it doesn't seem to show up...? So,
I'll have another try:

Also sprach lallous:

> AFAIK, This cannot be done w/ JavaScript
> randSeed = (randSeed * 1232) + (randSeed % 212) - randSeed & 0xFA11;
> // put any forumla you want....i am not an export at writing pseudo
> number generators functions

Well, I don't need anything statistically sophisticated. The background is,
I'm programming a game and need to lay out some cards in a random order to
start playing. Now I want to be able to get back to the same layout later by
simply selecting "game number 12345", where 12345 will be the seed that
should always generate the same deck of cards. Currently I shuffle the cards
by selecting two at random and swapping their places. This I do a number of
times, so more or less all the cards should be randomly displaced.

John M. Gamble
Guest
Posts: n/a

 02-17-2004
In article <(E-Mail Removed)>,
Dr John Stockton <(E-Mail Removed)> wrote:
>JRS: In article <c0r8gf\$fsb\$01\$(E-Mail Removed)-online.com>, seen in
>news:comp.lang.javascript, Thomas Mlynarczyk
><(E-Mail Removed)> posted at Mon, 16 Feb 2004 21:16:45 :-
>>Also sprach lallous:

>
>>Well, I don't need anything statistically sophisticated. The background is,
>>I'm programming a game and need to lay out some cards in a random order to
>>start playing. Now I want to be able to get back to the same layout later by
>>simply selecting "game number 12345", where 12345 will be the seed that
>>should always generate the same deck of cards. Currently I shuffle the cards
>>by selecting two at random and swapping their places. This I do a number of
>>times, so more or less all the cards should be randomly displaced.

>
>
>Your shuffling is, therefore, very probably not enough to achieve full
>randomness, or more than is necessary to achieve full randomness, or
>does not give equal probability to all possible results (assuming, that
>is, a perfect Random function).
>
>By reading the FAQ and following its "shuffling" reference, you could
>have found
>
> function Shuffle(Q) { var R, T, J
> for (J=Q.length-1 ; J>0 ; J--)
> { R=Random(J+1) ; T=Q[J] ; Q[J]=Q[R] ; Q[R]=T }
> return Q }
>
>which is AFAICS the best possible Shuffle.

This is actually well-known to be a bad shuffle algorithm. The
question comes up occasionally in sci.crypt, and also was discussed
in detail in the comp.lang.perl.moderated newsgroup. I think that
the perl FAQ was corrected with a much better shuffle as a result
(look for the key word 'permute').

The major flaw with this algorithm is that not all permutations are
equally possible. This may not be the worst problem with a
card-shuffling program, but i would be annoyed with it.

The algorithm (or one of them) that should be looked at is the
Fischer-Krause algorithm.

--
-john

February 28 1997: Last day libraries could order catalogue cards
from the Library of Congress.

Lasse Reichstein Nielsen
Guest
Posts: n/a

 02-17-2004
http://www.velocityreviews.com/forums/(E-Mail Removed) (John M. Gamble) writes:

> In article <(E-Mail Removed)>,
> Dr John Stockton <(E-Mail Removed)> wrote:

>>By reading the FAQ and following its "shuffling" reference, you could
>>have found
>>
>> function Shuffle(Q) { var R, T, J
>> for (J=Q.length-1 ; J>0 ; J--)
>> { R=Random(J+1) ; T=Q[J] ; Q[J]=Q[R] ; Q[R]=T }
>> return Q }
>>
>>which is AFAICS the best possible Shuffle.

>
> This is actually well-known to be a bad shuffle algorithm.

....
> The major flaw with this algorithm is that not all permutations are
> equally possible. This may not be the worst problem with a
> card-shuffling program, but i would be annoyed with it.

I think you are misreading the algorithm. In particular, notice that
the call to Random uses the loop iterator as argument. It does perform
a permutation and all permutations are equally probable (if the Random
function is, at least ... there are small deviations because you can't
use a random number in the range, e.g., 0..2^32-1 to pick a random
number in the range 0..6 with equal probability, but that is not a
serious problem unless Q.length is very large)

/L
--
Lasse Reichstein Nielsen - (E-Mail Removed)
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Pete
Guest
Posts: n/a

 02-18-2004
"Thomas Mlynarczyk" <(E-Mail Removed)> wrote in message news:<c0r8gf\$fsb\$01\$(E-Mail Removed)-online.com>...
> Also sprach lallous:
>
> > AFAIK, This cannot be done w/ JavaScript

>
> ((
>
> > randSeed = (randSeed * 1232) + (randSeed % 212) - randSeed & 0xFA11;
> > // put any forumla you want....i am not an export at writing pseudo
> > number generators functions

>
> Well, I don't need anything statistically sophisticated. The background is,
> I'm programming a game and need to lay out some cards in a random order to
> start playing. Now I want to be able to get back to the same layout later by
> simply selecting "game number 12345", where 12345 will be the seed that
> should always generate the same deck of cards. Currently I shuffle the cards
> by selecting two at random and swapping their places. This I do a number of
> times, so more or less all the cards should be randomly displaced.

This is similar to Freecells game recall method:

<html>
<title>Game Id</title>
<body>

<script>
var n=52; //card numbers, id's or whatever.

function rnd(){
}

function doIt(){
chosenGame=new Array();
for (var i=0; i < n; i++){
chosenGame[i] = i;
}
var k, x;
for (var i=0; i < n-1; i++){
k=Math.floor((n-i)*rnd());
if (k==(n - i)){
k=n-i-1;
}
x=chosenGame[i];
chosenGame[i]=chosenGame[i+k];
chosenGame[i+k]=x;
}
+" input original 'gameNumber' to replay this game, #1 in this"
+" example.\n\n"+chosenGame);
}
doIt();
</script>

</body>
</html>