Win a copy of Design for the Mind this week in the Design forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

Random, random

 
Gjorgi Var
Ranch Hand
Posts: 85
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
How would you force a random selection with Math.random from a section of range of possible values using only loops and Math.random()... you should be also able to exclude chosen values out of selection from that section. Say range is 1-100, you would like to be able to choose randomly from 10-70 range and prevent certain numbers from 10-70 to be selected... yeap, the begginer... am not asking for the code...
 
Ernest Friedman-Hill
author and iconoclast
Marshal
Pie
Posts: 24208
35
Chrome Eclipse IDE Mac OS X
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Well, to get an integer from 0 to 60, you can use Random.nextInt() and the modulo (%) operator to get only the remainder of dividing by 60. Then you can add 10 to get a number from 10 to 70. Then you could evaluate this in a loop; after each evaluation, check to see if the random value is one of the forbidden ones; if so, restart the loop; otherwise, you've got a good value, so break out of the loop.
 
Jim Yingst
Wanderer
Sheriff
Posts: 18671
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Also, pay attention to the max and min values. Ernest's algorithm above will give you numbers as low as 10 and as high as 69, but never 70. Maybe that's what you really needed, or maybe not. To get a range that includes both 10 and 70, you'd need 61 different possible values, not 60.
Also, if you use the Random class, you don't even need the modulo (%) operator - you can just use nextInt(int) instead. (See API for details.) If you must use Math.random() rather than the Random class, then you can just multiply the random() by 60 or 61 or whatever you need, then cast the result to int.
 
Gjorgi Var
Ranch Hand
Posts: 85
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Nothing like a little push from the sheriffs...
I want to use the Math.random rather than Random.nextInt. If I followed Ernest's advice right, I would always get 10 as a result:
(Math.random()%60)+10...
As far as just multiplying Math.random by the ceiling (60), I would also get values below desired floor (below 10)...
 
fred rosenberger
lowercase baba
Bartender
Pie
Posts: 12097
30
Chrome Java Linux
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Ernest's methos used Random.nextInt(), which returns an integer between 0 and (i don't remember exactly how large, but pretty big). hence the modulo operator to trim it down to the range you want.
Math.random() returns a double greater or equal to 0.0 and less than 1. So yes, Ernests method won't work with Math.random.(), but you shouldn't expect it to.
what you will need to do is MULTIPLY your double by the number of values in your range, which is 61 (10-70 inclusive). then, you need to add 10 to shift the values up to where you want them.
 
Gjorgi Var
Ranch Hand
Posts: 85
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Originally posted by fred rosenberger:
...
what you will need to do is MULTIPLY your double by the number of values in your range, which is 61 (10-70 inclusive). then, you need to add 10 to shift the values up to where you want them.

After coding this accordingly, I got what I needed... A big "thank you" from a begginer lost in fog... any literature recomended on problems like this?
 
sever oon
Ranch Hand
Posts: 268
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Well, you have some interesting requirements. If you want to choose a random int between x (inclusive) and y (exclusive), use the following method:

If you call the above method with min=5 and max=15, you'll get back x where 5 <= x < 15.
Now you also have the requirement that you want some values of x where min <= x < max to be prohibited as well. So you might want a random number between 0 and 100, but it can't be between 70 and 80. (Always assume, for the sake of simplicity, that I'm talking inclusive-exclusive ranges, so "between 0 and 100" means you could get back 0, but you could not get back 100.)
In that case, you need a method into which you can pass ranges of values, like 0 to 70, 81 to 100. When I look at this problem I think about mapping regions...so what you're really asking for is a random number between 0 and 90, then when you get that number back if it's >= 70, you want to add 11 to it.
The way I would go about solving this problem is to develop a Range class that represents a range of values from some min <= x < some max. You can add all sorts of methods to it so you can compare Ranges, merge them, expand and contract them, etc. And you can write a random number generator backed by the JDK's that works with them to develop evenly distributed random numbers over whatever series of Ranges you can instantiate.
sev
 
Layne Lund
Ranch Hand
Posts: 3061
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Originally posted by Gjorgi Var:

any literature recomended on problems like this?

I think some books on mathematics might help. In particular, you should look for books on algebra and discrete math. Sorry, I don't have any particular titles in mind, but hopefully the categories will help.
Layne
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic