How to use Cokus.c ??

C

CGP

I am reading a paper including MCMC simulation.
The code is using a cokus.c file for pseudo random number generation,
and the algorithm is called MT19937.
This cokus.c file provides with 3 functions:
seedMT()
reloadMT()
randomMT()
I've tried to use them to generate random numbers, but the result
seems weird (i generated 6e6 numbers within which there is no single
number less than 1000)
Please tell me, how to use this file to generate random numbers.
Thank you very much!
 
U

user923005

I am reading a paper including MCMC simulation.
The code is using a cokus.c file for pseudo random number generation,
and the algorithm is called MT19937.
This cokus.c file provides with 3 functions:
seedMT()
reloadMT()
randomMT()
I've tried to use them to generate random numbers, but the result
seems weird (i generated 6e6 numbers within which there is no single
number less than 1000)
Please tell me, how to use this file to generate random numbers.
Thank you very much!

The tool (a variant of the Mersenne Twister) comes with sample correct
output.

Consider a 9 digit random number. What are the odds that such a
number will be less than one thousand?

I guess that the tool is working correctly, but you have no idea what
you are doing.

I also suggest that you read the C-FAQ about random numbers.

It tells you (for instance) how to generate random numbers within a
certain range.
 
S

Squeamizh

The tool (a variant of the Mersenne Twister) comes with sample correct
output.

Consider a 9 digit random number.  What are the odds that such a
number will be less than one thousand?

If all outcomes are equally likely, the probability that any one
number is less than 1000 is:
1 - ((1e9 - 1e3) / 1e9)
= 1 - (1 - 1e-6)
= 1e-6
= 0.000001

If you generate 6 million numbers, which is what the OP said he did,
then the probability that at least one of them is less than 1000 is:

1 - ((1e9 - 1e3) / 1e9) ^ 6e6
= 1 - (1 - 1e-6) ^ 6e6
~ 1 - 0.00248
~ 0.99752

....so I would be just as surprised as the OP.
 
K

Kenny McCormack

user923005 said:
I guess that the tool is working correctly, but you have no idea what
you are doing.

The love and compassion that so typifies the CLC "expert".
 
U

user923005

If all outcomes are equally likely, the probability that any one
number is less than 1000 is:
  1 - ((1e9 - 1e3) / 1e9)
= 1 - (1 - 1e-6)
= 1e-6
= 0.000001

If you generate 6 million numbers, which is what the OP said he did,
then the probability that at least one of them is less than 1000 is:

  1 - ((1e9 - 1e3) / 1e9) ^ 6e6
= 1 - (1 - 1e-6) ^ 6e6
~ 1 - 0.00248
~ 0.99752

...so I would be just as surprised as the OP.

1. There are ten times as many nine digit numbers as you imagine.
2. The numbers actually generated are ten digit unsigned long numbers
between 2 and 2^32-1

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/MTARCOK/mt19937ar-cok.out

I modified the test driver a bit and here is what I got:

int main(void)
{
unsigned long minval = ULONG_MAX;
unsigned long maxval = 0;
unsigned long smallones = 0;
unsigned long current;
int i;
unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4;
init_by_array(init, length);
/* This is an example of initializing by an array. */
/* You may use init_genrand(seed) with any 32bit integer */
/* as a seed for a simpler initialization */
for (i=0; i<1000000; i++) {
current= genrand_int32();
if (minval > current) minval = current;
if (maxval < current) maxval = current;
if (current < 1000) smallones++;
}
printf("%lu = min, %lu = max", minval, maxval);
return 0;
}
/*
C:\math\rand\mt>mt19937ar-cok.exe
7879 = min, 4294965738 = max
*/
 
U

user923005

1.  There are ten times as many nine digit numbers as you imagine.
2.  The numbers actually generated are ten digit unsigned long numbers
between 2 and 2^32-1

between 0 and 2^32-1
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/MTARCOK/...

I modified the test driver a bit and here is what I got:

int main(void)
{
    unsigned long minval = ULONG_MAX;
    unsigned long maxval = 0;
    unsigned long smallones = 0;
    unsigned long current;
    int i;
    unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4;
    init_by_array(init, length);
    /* This is an example of initializing by an array.       */
    /* You may use init_genrand(seed) with any 32bit integer */
    /* as a seed for a simpler initialization                */
    for (i=0; i<1000000; i++) {
      current= genrand_int32();
      if (minval > current) minval = current;
      if (maxval < current) maxval = current;
      if (current < 1000) smallones++;
    }
    printf("%lu = min, %lu = max", minval, maxval);
    return 0;}

/*
C:\math\rand\mt>mt19937ar-cok.exe
7879 = min, 4294965738 = max
*/

I changed the upper bound to 6 million instead of one million and got
this:
C:\math\rand\mt>mt19937ar-cok.exe
1211 = min, 4294967144 = max
 
U

user923005

1.  There are ten times as many nine digit numbers as you imagine.
2.  The numbers actually generated are ten digit unsigned long numbers
between 2 and 2^32-1

between 0 and 2^32-1






I modified the test driver a bit and here is what I got:
int main(void)
{
    unsigned long minval = ULONG_MAX;
    unsigned long maxval = 0;
    unsigned long smallones = 0;
    unsigned long current;
    int i;
    unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4;
    init_by_array(init, length);
    /* This is an example of initializing by an array.       */
    /* You may use init_genrand(seed) with any 32bit integer */
    /* as a seed for a simpler initialization                */
    for (i=0; i<1000000; i++) {
      current= genrand_int32();
      if (minval > current) minval = current;
      if (maxval < current) maxval = current;
      if (current < 1000) smallones++;
    }
    printf("%lu = min, %lu = max", minval, maxval);
    return 0;}
/*
C:\math\rand\mt>mt19937ar-cok.exe
7879 = min, 4294965738 = max
*/

I changed the upper bound to 6 million instead of one million and got
this:
C:\math\rand\mt>mt19937ar-cok.exe
1211 = min, 4294967144 = max


Here is my result with 60 million generated numbers:
C:\math\rand\mt>mt19937ar-cok.exe
17 = min, 4294967170 = max
 
U

user923005

between 0 and 2^32-1
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/MTARCOK/....
I modified the test driver a bit and here is what I got:
int main(void)
{
    unsigned long minval = ULONG_MAX;
    unsigned long maxval = 0;
    unsigned long smallones = 0;
    unsigned long current;
    int i;
    unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4;
    init_by_array(init, length);
    /* This is an example of initializing by an array.       */
    /* You may use init_genrand(seed) with any 32bit integer */
    /* as a seed for a simpler initialization                */
    for (i=0; i<1000000; i++) {
      current= genrand_int32();
      if (minval > current) minval = current;
      if (maxval < current) maxval = current;
      if (current < 1000) smallones++;
    }
    printf("%lu = min, %lu = max", minval, maxval);
    return 0;}
/*
C:\math\rand\mt>mt19937ar-cok.exe
7879 = min, 4294965738 = max
*/
I changed the upper bound to 6 million instead of one million and got
this:
C:\math\rand\mt>mt19937ar-cok.exe
1211 = min, 4294967144 = max

Here is my result with 60 million generated numbers:
C:\math\rand\mt>mt19937ar-cok.exe
17 = min, 4294967170 = max

600 million:
C:\math\rand\mt>mt19937ar-cok.exe
15 = min, 4294967266 = max
 
U

user923005

I am reading a paper including MCMC simulation.
The code is using a cokus.c file for pseudo random number generation,
and the algorithm is called MT19937.
This cokus.c file provides with 3 functions:
seedMT()
reloadMT()
randomMT()
I've tried to use them to generate random numbers, but the result
seems weird (i generated 6e6 numbers within which there is no single
number less than 1000)
Please tell me, how to use this file to generate random numbers.
Thank you very much!
The tool (a variant of the Mersenne Twister) comes with sample correct
output.
Consider a 9 digit random number.  What are the odds that such a
number will be less than one thousand?
If all outcomes are equally likely, the probability that any one
number is less than 1000 is:
  1 - ((1e9 - 1e3) / 1e9)
= 1 - (1 - 1e-6)
= 1e-6
= 0.000001
If you generate 6 million numbers, which is what the OP said he did,
then the probability that at least one of them is less than 1000 is:
  1 - ((1e9 - 1e3) / 1e9) ^ 6e6
= 1 - (1 - 1e-6) ^ 6e6
~ 1 - 0.00248
~ 0.99752
...so I would be just as surprised as the OP.
1.  There are ten times as many nine digit numbers as you imagine..
2.  The numbers actually generated are ten digit unsigned long numbers
between 2 and 2^32-1
between 0 and 2^32-1
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/MTARCOK/...
I modified the test driver a bit and here is what I got:
int main(void)
{
    unsigned long minval = ULONG_MAX;
    unsigned long maxval = 0;
    unsigned long smallones = 0;
    unsigned long current;
    int i;
    unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4;
    init_by_array(init, length);
    /* This is an example of initializing by an array.       */
    /* You may use init_genrand(seed) with any 32bit integer */
    /* as a seed for a simpler initialization                */
    for (i=0; i<1000000; i++) {
      current= genrand_int32();
      if (minval > current) minval = current;
      if (maxval < current) maxval = current;
      if (current < 1000) smallones++;
    }
    printf("%lu = min, %lu = max", minval, maxval);
    return 0;}
/*
C:\math\rand\mt>mt19937ar-cok.exe
7879 = min, 4294965738 = max
*/
I changed the upper bound to 6 million instead of one million and got
this:
C:\math\rand\mt>mt19937ar-cok.exe
1211 = min, 4294967144 = max
Here is my result with 60 million generated numbers:
C:\math\rand\mt>mt19937ar-cok.exe
17 = min, 4294967170 = max

600 million:
C:\math\rand\mt>mt19937ar-cok.exe
15 = min, 4294967266 = max

110 = smallones (values less than 1000 for 600 million generated
values)
11 = smallones at 60 million
 
U

user923005

I am reading a paper including MCMC simulation.
The code is using a cokus.c file for pseudo random number generation,
and the algorithm is called MT19937.
This cokus.c file provides with 3 functions:
seedMT()
reloadMT()
randomMT()
I've tried to use them to generate random numbers, but the result
seems weird (i generated 6e6 numbers within which there is no single
number less than 1000)
Please tell me, how to use this file to generate random numbers.
Thank you very much!
The tool (a variant of the Mersenne Twister) comes with sample correct
output.
Consider a 9 digit random number.  What are the odds that such a
number will be less than one thousand?
If all outcomes are equally likely, the probability that any one
number is less than 1000 is:
  1 - ((1e9 - 1e3) / 1e9)
= 1 - (1 - 1e-6)
= 1e-6
= 0.000001
If you generate 6 million numbers, which is what the OP said he did,
then the probability that at least one of them is less than 1000 is:
  1 - ((1e9 - 1e3) / 1e9) ^ 6e6
= 1 - (1 - 1e-6) ^ 6e6
~ 1 - 0.00248
~ 0.99752
...so I would be just as surprised as the OP.
1.  There are ten times as many nine digit numbers as you imagine.
2.  The numbers actually generated are ten digit unsigned long numbers
between 2 and 2^32-1
between 0 and 2^32-1
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/MTARCOK/...
I modified the test driver a bit and here is what I got:
int main(void)
{
    unsigned long minval = ULONG_MAX;
    unsigned long maxval = 0;
    unsigned long smallones = 0;
    unsigned long current;
    int i;
    unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4;
    init_by_array(init, length);
    /* This is an example of initializing by an array.       */
    /* You may use init_genrand(seed) with any 32bit integer */
    /* as a seed for a simpler initialization                */
    for (i=0; i<1000000; i++) {
      current= genrand_int32();
      if (minval > current) minval = current;
      if (maxval < current) maxval = current;
      if (current < 1000) smallones++;
    }
    printf("%lu = min, %lu = max", minval, maxval);
    return 0;}
/*
C:\math\rand\mt>mt19937ar-cok.exe
7879 = min, 4294965738 = max
*/
I changed the upper bound to 6 million instead of one million and got
this:
C:\math\rand\mt>mt19937ar-cok.exe
1211 = min, 4294967144 = max
Here is my result with 60 million generated numbers:
C:\math\rand\mt>mt19937ar-cok.exe
17 = min, 4294967170 = max
600 million:
C:\math\rand\mt>mt19937ar-cok.exe
15 = min, 4294967266 = max

110 = smallones (values less than 1000 for 600 million generated
values)
11 = smallones at 60 million

A set size of 10 million gives one value less than 1000:

C:\math\rand\mt>mt19937ar-cok.exe
655 = min, 4294967144 = max 1 = smallones
 
S

Seebs

The love and compassion that so typifies the CLC "expert".

Compassion is sometimes best expressed through providing the information
people need to solve their problems.

Sometimes, the most useful feedback I can give someone is "at this time,
if you want that working, you should get someone who has the necessary
skills involved so that they can do it." Sometimes that someone is me.

-s
 
J

jacob navia

user923005 a écrit :
A set size of 10 million gives one value less than 1000:

C:\math\rand\mt>mt19937ar-cok.exe
655 = min, 4294967144 = max 1 = smallones

I think the generator is biased against small numbers...

I did not see that you refute the calculations done by
squeamizh. They look correct to me.
 
U

user923005

user923005 a écrit :




I think the generator is biased against small numbers...

I did not see that you refute the calculations done by
squeamizh. They look correct to me.

For the source code, it is really:
How many numbers are there between
0 and 4294967295?

The odds that a 3 digit number is generated for this are:
999/4294967295 = 2.3259781306437165780560384919066e-7
The odds that a number larger than three digits is generated is
therefore
1 - 2.3259781306437165780560384919066e-7 =
0.99999976740218693562834219439615
pow(0.99999976740218693562834219439615,6000000.0)
=0.24768759098554302021000907633928
So about 25% chance we don't see any three digit number after 6
million trials.
Hence, not surprising.

I guess if you try 1000 random seeds you will see plenty after 6
million trials.
 
U

user923005

For the source code, it is really:
How many numbers are there between
0 and 4294967295?

The odds that a 3 digit number is generated for this are:
999/4294967295 = 2.3259781306437165780560384919066e-7

Should have been 1000/4294967295 = 0.999999767169356291920262456853
since we have 0...999 which are 1000 distinct values.
The odds that a number larger than three digits is generated is
therefore
1 - 2.3259781306437165780560384919066e-7 =
0.99999976740218693562834219439615
pow(0.99999976740218693562834219439615,6000000.0)
=0.24768759098554302021000907633928

Correct value is 0.24734181691422263915364500907932
 
U

user923005

Should have been 1000/4294967295 = 0.999999767169356291920262456853
since we have 0...999 which are 1000 distinct values.

But there are also 4294967296 distinct values between 0 and 4294967295
so:
1000/4294967296=0.00000023283064365386962890625
Correct value is 0.24734181691422263915364500907932

Correct value is 0.24734181699467321849029386184689

Here is the result with a change of seed and 6 million cycles:

int main(void)
{
unsigned long minval = ULONG_MAX;
unsigned long maxval = 0;
unsigned long smallones = 0;
unsigned long current;
int i;
unsigned long init[4]={4211111111, 4211333333, 0x345, 0x456},
length=4;
init_by_array(init, length);
/* This is an example of initializing by an array. */
/* You may use init_genrand(seed) with any 32bit integer */
/* as a seed for a simpler initialization */
for (i=0; i<6000000; i++) {
current= genrand_int32();
if (minval > current) minval = current;
if (maxval < current) maxval = current;
if (current < 1000) smallones++;
}
printf("%lu = min, %lu = max", minval, maxval);
printf(" %lu = smallones\n",smallones);
return 0;
}
/*
c:\math\rand\mt>mt19937ar-cok.exe
95 = min, 4294966435 = max 3 = smallones
*/
 
S

Squeamizh

1.  There are ten times as many nine digit numbers as you imagine.
Explain.

2.  The numbers actually generated are ten digit unsigned long numbers
between 2 and 2^32-1

Then that is obviously a different math problem. Next time you tell
someone he has no idea what he's doing, you might want to use a more
convincing argument :).
 
U

user923005


OK, phrased incorrectly.
Then that is obviously a different math problem.  Next time you tell
someone he has no idea what he's doing, you might want to use a more
convincing argument :)

Someone who has the code and the output sitting in front of them
should deduce the result immediately.

I didn't think the OP was an idiot. I just gave a suggestion to
calculate the probability.
 
C

CGP

OK, phrased incorrectly.



Someone who has the code and the output sitting in front of them
should deduce the result immediately.

I didn't think the OP was an idiot. I just gave a suggestion to
calculate the probability.


Alright guys!
Thank you for your reply and squabbles :)
Perhaps user923005 is not using the same pseudo random number
generator.
Let me put the cokus.c code below so that everyone can copy it and try
it out.
To respect the authors I won't omit the licence & description part.

//////////////////////////// cokus.c
begin /////////////////////////////////////////////
// This is the ``Mersenne Twister'' random number generator MT19937,
which
// generates pseudorandom integers uniformly distributed in 0..(2^32 -
1)
// starting from any odd seed in 0..(2^32 - 1). This version is a
recode
// by Shawn Cokus ([email protected]) on March 8, 1998 of a
version by
// Takuji Nishimura (who had suggestions from Topher Cooper and Marc
Rieffel in
// July-August 1997).
//
// Effectiveness of the recoding (on Goedel2.math.washington.edu, a
DEC Alpha
// running OSF/1) using GCC -O3 as a compiler: before recoding: 51.6
sec. to
// generate 300 million random numbers; after recoding: 24.0 sec. for
the same
// (i.e., 46.5% of original time), so speed is now about 12.5 million
random
// number generations per second on this machine.
//
// According to the URL <http://www.math.keio.ac.jp/~matumoto/
emt.html>
// (and paraphrasing a bit in places), the Mersenne Twister is
``designed
// with consideration of the flaws of various existing generators,''
has
// a period of 2^19937 - 1, gives a sequence that is 623-dimensionally
// equidistributed, and ``has passed many stringent tests, including
the
// die-hard test of G. Marsaglia and the load test of P. Hellekalek
and
// S. Wegenkittl.'' It is efficient in memory usage (typically using
2506
// to 5012 bytes of static data, depending on data type sizes, and the
code
// is quite short as well). It generates random numbers in batches of
624
// at a time, so the caching and pipelining of modern systems is
exploited.
// It is also divide- and mod-free.
//
// This library is free software; you can redistribute it and/or
modify it
// under the terms of the GNU Library General Public License as
published by
// the Free Software Foundation (either version 2 of the License or,
at your
// option, any later version). This library is distributed in the
hope that
// it will be useful, but WITHOUT ANY WARRANTY, without even the
implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See
// the GNU Library General Public License for more details. You
should have
// received a copy of the GNU Library General Public License along
with this
// library; if not, write to the Free Software Foundation, Inc., 59
Temple
// Place, Suite 330, Boston, MA 02111-1307, USA.
//
// The code as Shawn received it included the following notice:
//
// Copyright (C) 1997 Makoto Matsumoto and Takuji Nishimura. When
// you use this, send an e-mail to <[email protected]> with
// an appropriate reference to your work.
//
// It would be nice to CC: <[email protected]> when you write.
//

#include <stdio.h>
#include <stdlib.h>

//
// uint32 must be an unsigned integer type capable of holding at least
32
// bits; exactly 32 should be fastest, but 64 is better on an Alpha
with
// GCC at -O3 optimization so try your options and see what's best for
you
//

typedef unsigned long uint32;

#define N (624) // length of state vector
#define M (397) // a period parameter
#define K (0x9908B0DFU) // a magic constant
#define hiBit(u) ((u) & 0x80000000U) // mask all but highest
bit of u
#define loBit(u) ((u) & 0x00000001U) // mask all but lowest
bit of u
#define loBits(u) ((u) & 0x7FFFFFFFU) // mask the highest
bit of u
#define mixBits(u, v) (hiBit(u)|loBits(v)) // move hi bit of u to hi
bit of v

static uint32 state[N+1]; // state vector + 1 extra to not
violate ANSI C
static uint32 *next; // next random value is computed from
here
static int left = -1; // can *next++ this many times before
reloading


void seedMT(uint32 seed)
{
//
// We initialize state[0..(N-1)] via the generator
//
// x_new = (69069 * x_old) mod 2^32
//
// from Line 15 of Table 1, p. 106, Sec. 3.3.4 of Knuth's
// _The Art of Computer Programming_, Volume 2, 3rd ed.
//
// Notes (SJC): I do not know what the initial state requirements
// of the Mersenne Twister are, but it seems this seeding
generator
// could be better. It achieves the maximum period for its
modulus
// (2^30) iff x_initial is odd (p. 20-21, Sec. 3.2.1.2, Knuth); if
// x_initial can be even, you have sequences like 0, 0, 0, ...;
// 2^31, 2^31, 2^31, ...; 2^30, 2^30, 2^30, ...; 2^29, 2^29 +
2^31,
// 2^29, 2^29 + 2^31, ..., etc. so I force seed to be odd below.
//
// Even if x_initial is odd, if x_initial is 1 mod 4 then
//
// the lowest bit of x is always 1,
// the next-to-lowest bit of x is always 0,
// the 2nd-from-lowest bit of x alternates ... 0 1 0 1 0 1
0 1 ... ,
// the 3rd-from-lowest bit of x 4-cycles ... 0 1 1 0 0 1
1 0 ... ,
// the 4th-from-lowest bit of x has the 8-cycle ... 0 0 0 1 1 1
1 0 ... ,
// ...
//
// and if x_initial is 3 mod 4 then
//
// the lowest bit of x is always 1,
// the next-to-lowest bit of x is always 1,
// the 2nd-from-lowest bit of x alternates ... 0 1 0 1 0 1
0 1 ... ,
// the 3rd-from-lowest bit of x 4-cycles ... 0 0 1 1 0 0
1 1 ... ,
// the 4th-from-lowest bit of x has the 8-cycle ... 0 0 1 1 1 1
0 0 ... ,
// ...
//
// The generator's potency (min. s>=0 with (69069-1)^s = 0 mod
2^32) is
// 16, which seems to be alright by p. 25, Sec. 3.2.1.3 of Knuth.
It
// also does well in the dimension 2..5 spectral tests, but it
could be
// better in dimension 6 (Line 15, Table 1, p. 106, Sec. 3.3.4,
Knuth).
//
// Note that the random number user does not see the values
generated
// here directly since reloadMT() will always munge them first, so
maybe
// none of all of this matters. In fact, the seed values made
here could
// even be extra-special desirable if the Mersenne Twister theory
says
// so-- that's why the only change I made is to restrict to odd
seeds.
//

register uint32 x = (seed | 1U) & 0xFFFFFFFFU, *s = state;
register int j;

for(left=0, *s++=x, j=N; --j;
*s++ = (x*=69069U) & 0xFFFFFFFFU);
}


uint32 reloadMT(void)
{
register uint32 *p0=state, *p2=state+2, *pM=state+M, s0, s1;
register int j;

if(left < -1)
seedMT(4357U);

left=N-1, next=state+1;

for(s0=state[0], s1=state[1], j=N-M+1; --j; s0=s1, s1=*p2++)
*p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);

for(pM=state, j=M; --j; s0=s1, s1=*p2++)
*p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);

s1=state[0], *p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K :
0U);
s1 ^= (s1 >> 11);
s1 ^= (s1 << 7) & 0x9D2C5680U;
s1 ^= (s1 << 15) & 0xEFC60000U;
return(s1 ^ (s1 >> 18));
}


inline uint32 randomMT(void)
{
uint32 y;

if(--left < 0)
return(reloadMT());

y = *next++;
y ^= (y >> 11);
y ^= (y << 7) & 0x9D2C5680U;
y ^= (y << 15) & 0xEFC60000U;
y ^= (y >> 18);
return(y);
}

//////////////////////////// cokus.c
end /////////////////////////////////////////////

Note:
In my own experiment, I use seedMT() first then use randomMT() to
generate numbers
the simple code segment is this

seedMT((uint32)time(NULL));
for(i=0; i<NUM_RANDNUMS; i++)
{
temp = randomMT();
if(temp<1000)
MessageBox(NULL, L"A number less than 1000 generated", L"caption",
MB_OK);
fprintf(fp, "%lu\n", temp); // write the number in file.
}


I am really amazed with the result, the odds in generating such a huge
number of random numbers without a single one less than 1000 is really
small.
And I have tried many times, the results are the same.

btw, C-FAQ doesn't answer the question about this cokus.c & mt19937
algorithm.
 
B

Ben Bacarisse

CGP said:
In my own experiment, I use seedMT() first then use randomMT() to
generate numbers
the simple code segment is this

seedMT((uint32)time(NULL));
for(i=0; i<NUM_RANDNUMS; i++)
{
temp = randomMT();
if(temp<1000)
MessageBox(NULL, L"A number less than 1000 generated", L"caption",
MB_OK);
fprintf(fp, "%lu\n", temp); // write the number in file.
}


I am really amazed with the result, the odds in generating such a huge
number of random numbers without a single one less than 1000 is really
small.

I don't think it is really small. I think it is about .25 as already
reported.

I plugged your posted code into a driver and found that about 75% of
the time there was a number < 1000 in the first 6 million (I stopped
after 550 runs). Maybe you should post the whole code (better, a
small example that shows the problem) because the trouble might be
somewhere else.
 
C

CGP

<snip MT code>






I don't think it is really small. I think it is about .25 as already
reported.

I plugged your posted code into a driver and found that about 75% of
the time there was a number < 1000 in the first 6 million (I stopped
after 550 runs). Maybe you should post the whole code (better, a
small example that shows the problem) because the trouble might be
somewhere else.

Thank you Ben!
I made a little modification to my program, and now it behaves like
your program.
As I calculated, the chances to get at least one number less than 1000
in 6e6 numbers is: 1-(1-1000/(2^32))^6000000 = 0.7527...
It corresponds very well with the current performance of my program.
Thank you all !
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,432
Messages
2,571,682
Members
48,796
Latest member
Greg L.

Latest Threads

Top