Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2013

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Testing a random integer generator

  • To: mathgroup at smc.vnet.net
  • Subject: [mg130393] Re: Testing a random integer generator
  • From: Bill Rowe <readnews at sbcglobal.net>
  • Date: Mon, 8 Apr 2013 00:05:36 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • Delivered-to: l-mathgroup@wolfram.com
  • Delivered-to: mathgroup-newout@smc.vnet.net
  • Delivered-to: mathgroup-newsend@smc.vnet.net

On 4/6/13 at 9:53 PM, c_mcinnis at hotmail.com (Clif McInnis) wrote:

>I am trying to test the random integer generator in a program to
>make sure that it gives the type of output that I am looking for. I
>expect it to generate (p<>q)<10 slightly less than 1/8 of the time
>and (p=q)<10 slightly more than 1/8 of the time, 9<(p<>q)<20
>slightly less than 3/8 of the time, and 9<(p=q)<20 slightly more
>than 3/8 of the time. Regardless of my expectations I would like to
>see how the numbers actually come out, and to that end was
>attempting to test the test the code, but I can not get it to
>generate (print) any numbers. I am sure that I have made an error
>somewhere in the code, but I can not find it and am not getting any
>error messages. Thank you for any and all help.

>Initialization :> ({x = 0, p = 0, q = 0})

The line above is the reason the code never prints a value. It
does not set x,p or q to 0. Look up RuleDelayed in the
documentation center. Change this to

x=0;

and your While loop will print values

>While[x < 100, {
>Clear[p, q],

the line above accomplishes nothing. It is not necessary in
Mathematica to clear variables before using them.

>q = RandomInteger[{1, 4}], If[q < 4,
>{p = RandomInteger[{10, 20}],
>q = RandomInteger[],
>If[q == 1, q = p, q = RandomInteger[{10, 20}]]}, {p = RandomInteger[{1, 9}],
>q = RandomInteger[],
>If[q == 1, q = p, q = RandomInteger[{1, 9}]]}], Print[p],
>Print[q]}; x++]

Note a better choice when you simply want to execute a section
of code n times is Do rather than While. The code below:


Do[
  {q = RandomInteger[{1, 4}];
   If[q < 4,
    p = RandomInteger[{10, 20}]; q = RandomInteger[];
    If[q == 1, q = p,
     q = RandomInteger[{10, 20}]], {p = RandomInteger[{1, 9}],
     q = RandomInteger[],
     If[q == 1, q = p, q = RandomInteger[{1, 9}]]}], Print[p],
   Print[q]}, {100}]

does exactly the same as your code without the need for x.

Also, Print sends its output to $Output. So, unless you redefine
$Output, you won't capture the results of your generator for
further analysis.

an efficient way to capture the output would be as follows:


output = {};
Do[
  {q = RandomInteger[{1, 4}];
   If[q < 4,
    p = RandomInteger[{10, 20}]; q = RandomInteger[];
    If[q == 1, q = p,
     q = RandomInteger[{10, 20}]], {p = RandomInteger[{1, 9}],
     q = RandomInteger[],
     If[q == 1, q = p, q = RandomInteger[{1, 9}]]}],
   output = {output, p, q}}, {100}]

This captures all of the p,q values in a nested list which can
be made into a simple list using Flatten. That is you can do

Histogram[Flatten@output]

to create a histogram of p,q values. Or

Mean[Flatten@output] to compute the mean value and so on.




  • Prev by Date: Re: Not-understandable warning
  • Next by Date: Simplify an expression with respect to one of many variables
  • Previous by thread: Testing a random integer generator
  • Next by thread: Re: Testing a random integer generator