Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int seed = 2;
- int[int] s;
- int mt_index = 623;
- //this is a function for 32bit multiplication because ASH doesn't manipulate numbers the way we need.
- int mult32(int a, int b) {
- int product = 0;
- for (int i = 0; i < 32; i++) {
- product += (a << i) * (1 & b);
- b >>>= 1;
- }
- return product;
- }
- //this is some linear map that we use in the recursion function.
- //except we don't actually use it because php made an oopsie where they look at the lowest bit of the wrong thing.
- int A(int x){
- if((x&1) == 0){
- return (x >>> 1);
- }
- else{
- return ((x >>> 1) ^ 2567483615);
- }
- }
- //this is the MT recursion function, maybe?
- int twist(int m, int u,int v){
- //if done correctly(?):
- //return (m ^ A( ( ( u & 2147483648 ) | ( v & 2147483647 ) ) ));
- //the way php does it:
- return ( m ^ ( ( ( u & 2147483648 ) | ( v & 2147483647 ) ) >> 1 ) ^ ( ( 4294967295 * ( u & 1 ) ) & 2567483615 ) ) ;
- }
- //this is the tempering function. God only knows what it does.
- int temper(int x){
- int s_one;
- s_one = s[x];
- s_one ^= (s_one >> 11);
- //s_one ^= ((s_one << 7)%4294967295) & 2636928640;
- //s_one ^= ((s_one << 15)%4294967295) & 4022730752;
- s_one ^= (s_one << 7) & 2636928640;
- s_one ^= (s_one << 15) & 4022730752;
- //s_one ^= (((s_one << 7)<<32)>>>32) & 2636928640;
- //s_one ^= (((s_one << 15)<<)>>32) & 4022730752;
- return ( s_one ^ (s_one >> 18) );
- }
- //this is going to actually spit out random numbers in the specified range, allegedly.
- int mt_rand(int min, int max){
- mt_index++;
- return (min + ( max - min + 1 ) * (( temper(mt_index) >> 1 ) / ( 2147483647 + 1.0))) ;
- }
- //this is how mt_srand() converts the seed into a 624 word initial condition.
- s[0] = seed & 2147483647;
- for j from 1 to 623{
- //s[j] = ( ( ( 1812433253 * ( s[j-1] ^ ( s[j-1] >> 30 ) ) ) + j ) % 4294967295 ) & 2147483647 ;
- s[j] = ( ( mult32( 1812433253 , ( s[j-1] ^ ( s[j-1] >>> 30 ) ) ) + j ) ) & 2147483647 ;
- //s[j] = ( ( 1812433253 * ( s[j-1] ^ ( s[j-1] >> 30 ) )) + j ) & 2147483647 ;
- //print(s[j]);
- }
- //this generates the next 624 terms, which are the first 624 outputs of mt_rand() before tempering, probably? and I don't care about more than that, probably?
- for i from 0 to 623{
- s[624+i] = twist(s[397+i],s[i],s[i+1]);
- }
- for i from 0 to 10{
- print(mt_rand(0, 100));
- }
- /*
- output:
- 29
- 66
- 51
- 13
- 83
- 55
- 4
- 27
- 20
- 22
- 2
- */
- /*
- output upon commenting out line 62 and uncommenting 61:
- 27
- 64
- 48
- 58
- 78
- 83
- 67
- 48
- 4
- 72
- 42
- and all such combinations of comments/uncomments produce one of those two lists.
- */
- /*
- here's what some php sandbox says it should be: https://imgur.com/8ta2ZmG
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement