omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    How Random is randint()?

    Pythonista
    2
    5
    3215
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Cubbarooney104
      Cubbarooney104 last edited by

      Well, I had my doubts about randint() so I decided to test it out. I whipped up a little code in order to do so.

      <pre>
      from random import randint
      from console import clear
      zero = one = two = three = 0
      ergo = 0
      clean = 0
      while ergo < 1000000:
      #Randomly choses 0,1,2,or3
      spin = randint(0,3)
      #Keeps track of how often a given number comes up
      if spin == 0:
      zero += 1
      elif spin ==1:
      one += 1
      elif spin == 2:
      two += 1
      elif spin == 3:
      three += 1
      ergo += 1
      clean +=1
      #This prints what number ergo is at, in thousands
      if clean == 1000:
      clean = 0
      clear()
      print (ergo)
      #Converts the tallies into percentages and then prints the results
      y=0
      rolls = [zero, one, two, three]
      names = ["zero","one","two","three"]
      for x in rolls:
      spam = (x/1000000.0)*100
      print (names[y]+":"+str(spam)+"%")
      y += 1
      </pre>

      To explain what this program does, it randomly choses one of four numbers (zero, one, two, or three). It then keeps a tally of which number it choses. It proceeds to do this a total of one million times!

      After the computation is complete, it turns the tallies into percentages and prints the results. Because there are four numbers, each number should appear 25% of the time. Here is the results from my most recent running:

      <pre>
      1000000
      zero:25.0265%
      one:24.9848%
      two:24.9903%
      three:24.9984%
      </pre>

      As you can see, each number appears (almost) 25% of the time. I'd say that randint() works pretty well.

      Just a word to the wise, the program takes some time to run. Somewhere between five and ten minutes.

      Cubbarooney

      1 Reply Last reply Reply Quote 0
      • eliskan175
        eliskan175 last edited by

        Yeah I have done a similar program to this in the past. Actually that slight variance in your program is only due to the fact you didn't test enough population. It should eventually converge on 25% of the time.

        Randint is very solid :)

        1 Reply Last reply Reply Quote 0
        • Cubbarooney104
          Cubbarooney104 last edited by

          That may be due to the fact the decimals are so small that the program rounds up. I plan on trying one billion (just for fun), but I need to make sure the iPad doesn't die on me XD

          Either way, randint() is reliable (to say the least).

          Cubbarooney

          1 Reply Last reply Reply Quote 0
          • eliskan175
            eliskan175 last edited by

            To speed up the loop considerably, remove print and clear from the program. Printing a lot of times has the side effect of causing tremendous lag. I noticed this when debugging my games.

            On my PC, I am able to get it to perform the 1 million loops in only 5 seconds. So I amped it up to 10 million..

            zero:25.00252%
            one:24.99031%
            two:25.0049%
            three:25.00227%
            Time took: 50.25

            As expected, 10 times longer. Sooo I can safely amp it up to 100 million and just wait 10 minutes:

            zero:25.003407%
            one:24.996334%
            two:25.004265%
            three:24.995994%
            Time took: 528.875

            It doesn't get much closer than that! I wouldn't suggest trying 1 billion since (on my computer) it would take 5000+ seconds.

            If you want to see how long a loop runs, you can do something like this:

            from time import time
            start = time()
            #insert program or loop here
            print time()-start #print current time (in seconds)

            You can always reset the start timer.

            1 Reply Last reply Reply Quote 0
            • Cubbarooney104
              Cubbarooney104 last edited by

              83 and 1/3 hours.... That would be quite some time!

              And thanks for the tip on clear and print. I have another program that does a loop a lot, but it does print a bit. I'll see what I can cut. I assume sounds slow it down a bit too.

              And thanks for the additional research!

              Randint() is very solid!

              Cubbarooney

              1 Reply Last reply Reply Quote 0
              • First post
                Last post
              Powered by NodeBB Forums | Contributors