Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

Posted on 2011-03-22
Medium Priority
553 Views
Keep receiving strange datetime (7/1/2336 7:13:47 AM) using RandomInt(.079201111111111) understanding Random returns double.

private double Randm()
{
Random random = new Random();
return random.Next(1800000, 36000000); // .5 hour to 10 hours
}

MessageBox.Show(dt.ToString());
0
Question by:pointeman
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 4
• 4
• 4
• +2

LVL 33

Expert Comment

ID: 35193314
Random.Next returns an int.  You're adding 1.8 million hours.
0

LVL 33

Expert Comment

ID: 35193316
0

LVL 10

Accepted Solution

eguilherme earned 252 total points
ID: 35193326
?/ if you want to add from .5 to 10 hours use

private double Randm()
{
Random random = new Random();
return random.Next(30, 600); // .5 hour to 10 hours
}

MessageBox.Show(dt.ToString());
0

LVL 4

Assisted Solution

philetaylor earned 252 total points
ID: 35193330
Hi.

You are assigning a range to Randm of between 1800000 and 36000000

The problem is that you are then using the AddHours method which will be adding between 180000 and 36000000 HOURS to the time!

I think you probably want to use a range of 30 to 600 and use the AddMinutes method instead!

private double Randm()
{
Random random = new Random();
return random.Next(30,600); // .5 hour to 10 hours
}

MessageBox.Show(dt.ToString());

Cheers

Phil
0

LVL 86

Assisted Solution

Mike Tomlinson earned 248 total points
ID: 35193935
Here's another way to think about it:
``````private Random random = new Random();

private TimeSpan RandomHours(double minHour, double maxHour)
{
return TimeSpan.FromMilliseconds(TimeSpan.FromHours(minHour).TotalMilliseconds + (random.NextDouble() * TimeSpan.FromHours(maxHour - minHour).TotalMilliseconds));
}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(dt.ToString());
}
``````
0

Author Comment

ID: 35194757
I'm also using Randm() method to return values to Windows.Forms.Timer:

return random.Next(1800000, 36000000); // .5 hour to 10 hours

Came up with the idea to monitor the timers 'fire' time as a second thought.
0

Author Comment

ID: 35194770
>>The problem is that you are then using the AddHours method which will be adding between 180000 and 36000000 HOURS to the time!

I thought I was using adding approx .079201111111111 or 3/4 hours to the DateTime.AddHours as per original post :)
0

LVL 4

Expert Comment

ID: 35194787
Yes I thought you might!

Here is the definition of the Random.Next Method:

``````public virtual int Next(
int minValue,
int maxValue
)
``````
0

LVL 86

Expert Comment

ID: 35194789
You could also use my post for your Timer, just use the TotalMilliseconds() property of the returned TimeSpan:

timer1.Interval = RandomHours(.5, 10).TotalMilliseconds;
0

Author Comment

ID: 35195156
Could also:

private double Randm()
{
Random random = new Random();
return random.Next(30,600); // .5 hour to 10 hours
}

MessageBox.Show(dt.ToString());

Timer timer1 = new Timer();
timer1.Interval = Randm() * 60000; //1800000, 36000000 or .5 hour, 10 hours
0

LVL 33

Assisted Solution

Todd Gerbert earned 248 total points
ID: 35195206
I think I would probably just write - complete with the comment, so I know what the heck it's doing when I read the code later:
``````public partial class Form1 : Form
{
static Random rand = new Random();

public Form1()
{
InitializeComponent();

timer1.Interval = rand.Next(30, 600) * 60000; // 30 - 600 minutes (.5 - 10 hours) times 60000 to get millisecs
}
}
``````

Just seems simpler, more straight forward, to me. *shrug*

(Hopefully my math isn't too wrong)
0

LVL 86

Expert Comment

ID: 35195343
That's why I really like the TimeSpan.FromHours() approach...it's "self documenting":

timer1.Interval = TimeSpan.FromHours(someHourValue).TotalMilliseconds;

We get a TimeSpan() representing that number of hours (it can accept a double) and then ask it for the total milliseconds that represent that "time span".  No xxx * 60000, or any other value that you have to remember for whatever unit (hours, minutes, seconds) you are looking for.  There are other TimeSpan.FromXXX() methods as well...
0

LVL 33

Expert Comment

ID: 35195404
Agreed, I like that idea better.

Although that other method you posted ealier (http:#a35193935) took me more than a couple scratches of the ole noggin to figure out. ;)
0

LVL 86

Expert Comment

ID: 35195457
Lolz...that is just a C# version of this very old formula from the VB6 Rnd() function:
http://msdn.microsoft.com/en-us/library/e566zd96(VS.85).aspx

To produce random integers in a given range, use this formula:

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

So my code is:

private TimeSpan RandomHours(double minHour, double maxHour)
{
return TimeSpan.FromMilliseconds(TimeSpan.FromHours(minHour).TotalMilliseconds + (random.NextDouble() * TimeSpan.FromHours(maxHour - minHour).TotalMilliseconds));
}

The "inner part", inside the outer TimeSpan.FromMilliseconds(), is the formula from the link (just the order of the terms has been reversed):

TimeSpan.FromHours(minHour).TotalMilliseconds + (random.NextDouble() * TimeSpan.FromHours(maxHour - minHour).TotalMilliseconds)
0

Author Closing Comment

ID: 35197865
Great Help. Almost ran out of points.
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article is for Object-Oriented Programming (OOP) beginners. An Interface contains declarations of events, indexers, methods and/or properties. Any class which implements the Interface should provide the concrete implementation for each Interâ€¦
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
Weâ€™ve all felt that sense of false security beforeâ€”locking down external access to a database or component and feeling like weâ€™ve done all we need to do to secure company data. But that feeling is fleeting. Attacks these days can happen in many wâ€¦
This lesson discusses how to use a Mainform + Subforms in Microsoft Access to find and enter data for payments on orders. The sample data comes from a custom shop that builds and sells movable storage structures that are delivered to your property. â€¦
###### Suggested Courses
Course of the Month8 days, 20 hours left to enroll