rand() question

D

daniel kaplan

so i generate a serial number with the exact code below (three lines):

$number1 = 10000 + int(rand(99999));
$number2 = 10000 + int(rand(99999));
$shrwsn = "$number1-$number2";

the point is i want TWO five digit numbers separated by a dash "-"
and all is cool, but i just noticed, that for the three entries i have made
test wise:

79109-72626
106421-1023 these last two are six and four digits.....
108629-3542

WHY? these were all made with the SAME script...............
 
M

Marc Dashevsky

so i generate a serial number with the exact code below (three lines):

$number1 = 10000 + int(rand(99999));
$number2 = 10000 + int(rand(99999));
$shrwsn = "$number1-$number2";

the point is i want TWO five digit numbers separated by a dash "-"

So why don't you do:

$shrwsn = sprintf("%05d-%05d", rand(100000), rand(100000));
 
J

Joe Smith

daniel said:
so i generate a serial number with the exact code below (three lines):

$number1 = 10000 + int(rand(99999));

That creates a number between 10000 and 109999, which can be 6 digits.
106421-1023 these last two are six and four digits.....
108629-3542

They look like a six digit number with a hyphen and a five or six
digit number where the result has been truncated to 11 characters.

$result = substr "106421-10230",0,11; # or "106421-102300"
$result = substr "108629-35429",0,11;

-Joe
 
I

Ian Sedwell

Hi Daniel

As a Pascal/C/Modula-2 compiled languages rule OK programmer, my gut
reaction is integer overflow. Perl performs all of its numerical
calculations using floating point math in a manner that is determined by the
CPU and the operating system on which it is running. This will obviously
vary from platform to platform. To be honest I doubt that this is in fact
the explanation and someone more knowledgeable than I will set you straight.

But there are two things that might help you home in on the problem.

First off, try the same routine, but with numbers in a range less than
32,000.

Second, have you tried using the integer pragma?

use integer;
#your integer arithmetic code goes here
no integer;
#back to using floating point


On a different note, if you want your numbers to be as close to random as
possible, you should set a random seed first. If you don't Perl is quite
likely to produce the same 'random' series each time you run it. So you
should certainly mod your code to be something like:

srand();
$randomNumber = int(rand(999));

You can provide a seed parameter to srand, but if you don't it will use the
current time.


Happy problem solving

Ian
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top