Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Third error: This is not the correct way to randomly pick a number in a set range. The proper way is actually quite complicated. Imagine you do (int) (Math.random() * 10), this could give you numbers from 0 to 10. However, you only get 0 if Math.random() * 10 is less than 0.5, but you get 1 if the value is between 0.5 and 1.5. You are half as likely to see a zero!

I can't speak for Python, but in Java it's quite simple to do it right; Random#nextInt(int) "Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive)" (also consider using SecureRandom).



We're all aware that casting to an integer does truncation, not rounding. Right?


At least in Java and other languages, when casting as int truncates, and doesn't round the number, so: ((int) (0.9999999)) == 0 But then there's Math.floor and Math.ceil for what you're describing which can be used as well.


  public class example
  {
      public static void main(String[] JAVA_LOL) throws Throwable
      {
          // prints "6"
          System.out.println((int)6.99999);
      }
  }


You (and everyone else) are of course right. I remembered the wrong thing, what I said doesn't apply to that method in Java. What does apply is that there are lots of subtleties in generating random numbers, and there's rarely a reason to re-invent the wheel. There's a good example of how subtle pseudorandomness is in the Java documentation, so I will link that instead of embarrassing myself further: http://download.oracle.com/javase/1.4.2/docs/api/java/util/R...


I actually struggle to understand why people even use Math.random() when the Random class exists.


Don't need an import for Math.random(). Random is in java.util, while Math is in java.lang.


Alot of people probably look for Random but find Math.random().


> I can't speak for Python, but in Java it's quite simple to do it right

http://docs.python.org/library/random.html#random.randint


Actually the python equivalent of "Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive)" would be random.randrange(0, n, 1)

random.randint(a, b) returns a uniformly distributed int value between a (inclusive) and b (inclusive).

</nitpick>


import random # will print an integer between 0 and 10 inclusive print randint(0,10)


In that case you can always use floor or ceil.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: