• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

Math.random

 
Ranch Hand
Posts: 35
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thanx for your reply i learned quite alot but the formula u told is like for a range of 10 numbers from 30-40:
Math.random()*10+30
but it is not working in that way.
only the formula i mentioned before is working properly and i don't know what is the logic behind that formula

[This message has been edited by Argm Mastoi (edited October 18, 2001).]
 
Ranch Hand
Posts: 515
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
It works like this.. the Math.random() method creates a number between 0 and 1. so it will randomly create a floating point number. You then can create any number from that by adjusting the range and starting point. The range is what you multiply by and the starting point is what you add on after this. Example
I want to create a number from 1 to 10
I would do the following
Math.random()*10
so I get a .31 for my Math.random part. I do the multiply and get 3.1
So my number is now 3.
Next I decide... no infact I need a number from 30 to 40. My range is 10 and my starting point is 30. So I then start again
Lets say again I get .31
I multiply by 10 and get 3.1 .. which infact is cut off to be 3
then I add my base of 30.
I get 33.
Get it!?
So in your case you have the following
---------------------------------
Math.random()*(1000-500)+500
the first part creates a number between 0 and 1
lets again say .31
The 1000-500 is calculated first to get 500 so we know your range is 500. We take your number and multiply it by 500. .31 * 500 is 155. Then we add 500 to it and get 655. It works great. So your formulate says this...
Math.random()*(endingRangeNumber-StartingRangeNumber)+StartingPoint
Or if you want to simplify it
Math.random()*(rangeOfNumbersInYourSet) + startingPoint
So if you wanted a number between 300 and 350, you would have this
(Math.random() * 50) + 300
Hope this helps.

Dale

------------------
By failing to prepare, you are preparing to fail.
Benjamin Franklin (1706 - 1790)
[This message has been edited by Dale DeMott (edited October 18, 2001).]
 
Argm Mastoi
Ranch Hand
Posts: 35
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
thanx alot, it was really a problem that u solved. i understood the thing quite properly,
Argm.
 
Greenhorn
Posts: 20
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
One thing was overlooked with the formula... it only gives numbers ranging from 30-39 and not till 40. Does anyone know? Thanks in advance.
 
Margaret Tan
Greenhorn
Posts: 20
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I have to add that it only range till 39 since the Math.random() method returns a DOUBLE value greater than or EQUAL to 0.0 but LESS THAN 1.0 (not the less than, there's no equal to)
 
Ranch Hand
Posts: 158
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
You are correct Margaret, the Math.random () function returns a double value greater than or equal to 0.0 and strictly less than 1.0. and if you multiply that number by a range number, you'll get random numbers less than the range max, but never exactly the range max. Now if you cast the random numbers to ints like so:
(int) (Math.random () * rangeMax);
then you'll get a list of integers between 0 and rangeMax. If you want to include the rangeMax, you'll have to add one to it, then multiply by Math.random ().
------------------
Michael J Bruesch
Codito, ergo sum...
I code, therefore I am.
http://www.geocities.com/mjbruesch
 
Margaret Tan
Greenhorn
Posts: 20
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thanks for supporting my answer Michael.. but I don't understand how your formula can give the range from 30-40?
(int)(Math.random()*10 + 30)
this formula would give answers from 30-39 but how do you modify this to make it generate numbers from 30-40?
Thanks..
 
Margaret Tan
Greenhorn
Posts: 20
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Sorry Mike,
I just got your formula.. hehe guess didn't read close enough.
Ok, can you give me a formula where you can generate numbers from rangeMin to rangeMax? Thanks
 
Michael Bruesch
Ranch Hand
Posts: 158
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
if you need the numbers in your range to be integers, then the following should suffice:



------------------
Michael J Bruesch
Codito, ergo sum...
I code, therefore I am.
http://www.geocities.com/mjbruesch
 
Margaret Tan
Greenhorn
Posts: 20
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
uh uh , doesn't work Mike, here is the code and the output
class TestRandom{
public static void main(String args[]){
int num, i=0;
int rangeMin=30;
int rangeMax=40;
do{
//generates random number starting from rangeMin to rangeMax
num = (int)(Math.random()*(rangeMax+1)+rangeMin);
System.out.println(num);
}while(num!=40);
}
}
output from DOS prompt.. see how it generate a number more than 40?
35
48
59
53
48
33
40
 
Michael Bruesch
Ranch Hand
Posts: 158
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Whooops, sorry Margaret, had the close parenthesis in the wrong place, should be:

Sorry!
------------------
Michael J Bruesch
Codito, ergo sum...
I code, therefore I am.
http://www.geocities.com/mjbruesch
 
Michael Bruesch
Ranch Hand
Posts: 158
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Alright, I'm all confused. I'm sorry, the variable name shouldn't be rangeMax, it should be just range. In your case, the range of numbers is 10, ie. from 30 to 40. So substitue range for rangeMax and you're homefree. I compiled and ran this code to make sure it's correct:


------------------
Michael J Bruesch
Codito, ergo sum...
I code, therefore I am.
http://www.geocities.com/mjbruesch
 
Michael Bruesch
Ranch Hand
Posts: 158
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
And actually, if you think about it, from 30 to 40 is actually 11 numbers possible, so your range is actually 11 and not 10.
 
Argm Mastoi
Ranch Hand
Posts: 35
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
hi Margaret,
If you've closely looked over the code, provided by Dale, you can easily understand that in the formula, there's an starting point(where to start?) and inspite of the ending point the range of number is given(means upto what number of numbers it has to generate) so its you to tell the range whether 10 or 11.
for numbers 30-40:
(int)((Math.random()*11)+30)
I hope this formula will work out.
Argm
 
Michael Bruesch
Ranch Hand
Posts: 158
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
That's what I was trying to say, only it took about 4 posts to do it.
But they say, it's not the destination, it's the journey....or something like that.
Happy random number finding!
 
Sheriff
Posts: 17644
300
Mac Android IntelliJ IDE Eclipse IDE Spring Debian Java Ubuntu Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Don't know if any changes have been made to Math.random() recently but I have read advice from one author to use the java.util.Random class instead of Math.random() as the latter has a flaw in its algorithm.

------------------
Junilu Lacar
Sun Certified Programmer for the Java� 2 Platform
 
Dale DeMott
Ranch Hand
Posts: 515
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
At the risk of being redundant I wanted to clarify what I was saying so you could understand it a bit more. Again the formula is this
Math.random()*(rangeOfNumbersInYourSet) + startingPoint
If you wanted to create a list of numbers from 30 to 40 (including the ending points 30 and 40), there are 11 numbers in the list so your range would have 11 in it. You have to remember when you are subtracting numbers, you are actually counting the spaces between the numbers. Not the numbers themselves. If you want to count the numbers, you always need to add 1. Example - If I want a range of numbers from 0 to 4 (including 4), I need to tell the system 5. Reason being is that there are 5 numbers in my set. 0, 1, 2, 3, 4. I should have altered my formula to state the following
Math.random()*(rangeOfNumbersInYourSet + 1) + startingPoint
This usually appropriate since most people assume the range will include the last element in the list. So again if I wanted a range of numbers from 300 to 350, (including 350) it would look like this.
Math.random()*(350 - 300 + 1) + 300
Regards,
Dale DeMott

------------------
By failing to prepare, you are preparing to fail.
Benjamin Franklin (1706 - 1790)
 
With a little knowledge, a cast iron skillet is non-stick and lasts a lifetime.
reply
    Bookmark Topic Watch Topic
  • New Topic