# Tausworthe Random Numbers (seeded)

Actionscript:
2. var s1:Number= 0xFFFFFF;
3. var s2:Number = 0xCCCCCC;
4. var s3:Number= 0xFF00FF;
5.
6. // saw this algorithm on this somewhat annoying thread:
8. // additional googling brought me to this: http://wakaba.c3.cx/soc/kareha.pl/1100499906/
9. // and finally to this ( didn't understand most of this one) www.ams.org/mcom/1996-65-213/S0025-5718-96-00696-5/S0025-5718-96-00696-5.pdf
10.
11. function rand():Number {
12.     s1=((s1&4294967294)<<12)^(((s1<<13)^s1)>>19);
13.     s2=((s2&4294967288)<<4)^(((s2<<2)^s2)>>25);
14.     s3=((s3&4294967280)<<17)^(((s3<<3)^s3)>>11);
15.     var r:Number = (s1^s2^s3) * 2.3283064365e-10;
16.     r = (r<0) ? r+=1 : r;
17.     return r;
18. }
19.
20. // see a visual comparison between this and actionscript's Math.random()
21.
22. var canvas:BitmapData = new BitmapData(400,400,false, 0xCCCCCC);
24.
25. var posX:Number;
26. var posY:Number;
27.
29.
30. function onLoop(evt:Event):void {
31.
32.     for (var i:int = 0; i<100; i++){
33.         posX = rand() * 180
34.         posY = rand() * 180
35.         canvas.setPixel( 100 + posX, 10 + posY, 0x000000);
36.     }
37.
38.     for (i = 0; i<100; i++){
39.         posX = Math.random() * 180
40.         posY = Math.random() * 180
41.         canvas.setPixel( 100 + posX, 210 + posY, 0x000000);
42.     }
43. }

The above snippet demo's an alternative random number generator that uses the Tausworthe method.

Top square is Tausworthe and bottom is Math.random()

I don't actually know much about this, or fully understand how it works. I just saw it on a random reddit thread, googled about it for a few minutes and then ported it to actionscript.

There's lots of talk about what the BEST random number generator is.... which one is the fastest, which one is the most random. etc... I don't really know much about that, especially since I'm just playing around with code and I don't need a RNG for some scientific experiment. For me, what's nice about this approach is the three random seeds. For some reason, Math.random() doesn't have a place where you can enter a seed for random numbers. Random seeds are very useful when you want to do something random but want to be able to replicate the random results at a later time. For instance:

Actionscript:
1. var s1:Number= 0xFFFFFF;
2. var s2:Number = 0xCCCCCC;
3. var s3:Number= 0xFF00FF;
4.
5. trace("first three values:");
6. trace(rand());
7. trace(rand())
8. trace(rand())
9.
10. s1 = 0xFF;
11. s2 = 0xEFEFEF;
12. s3 = 19008;
13.
14. trace("\nfirst three values with different seeds:");
15. trace(rand());
16. trace(rand())
17. trace(rand())
18.
19. s1 = 0xFFFFFF;
20. s2  = 0xCCCCCC;
21. s3 = 0xFF00FF;
22.
23. trace("\noriginal three values:");
24. trace(rand());
25. trace(rand())
26. trace(rand())
27.
28. function rand():Number {
29.     s1=((s1&4294967294)<<12)^(((s1<<13)^s1)>>19);
30.     s2=((s2&4294967288)<<4)^(((s2<<2)^s2)>>25);
31.     s3=((s3&4294967280)<<17)^(((s3<<3)^s3)>>11);
32.     var r:Number = (s1^s2^s3) * 2.3283064365e-10;
33.     r = (r<0) ? r+=1 : r;
34.     return r;
35. }
36.
37. /*
38. outputs:
39. first three values:
40. 0.051455706589931385
41. 0.050584114155822715
42. 0.417276361484596
43.
44. first three values with different seeds:
45. 0.6032885762463134
46. 0.9319786790304015
47. 0.8631882804934321
48.
49. original three values:
50. 0.051455706589931385
51. 0.050584114155822715
52. 0.417276361484596
53. */

I stumbled upon a bunch of other random number algorithms, maybe I'll throw them in a class in the next couple days.

1. Posted October 21, 2009 at 9:43 am | Permalink

Haha what’s the visual difference? Noise on both images looks pretty random

2. Eric
Posted March 8, 2013 at 6:22 pm | Permalink

One tausworth method looks a little better. notice the black banding at the bottom of math.random.

Try multiple tausworth methods together, and google Central Limit therom. Also make a .wav file from your code and listen. you will be able to hear differences.