Generate 16 digit positive random Numbers

Hi Unix Gurus,

I have a requirement to generate positive random 16 and 13 digit numbers.

Here is the script I have so far.....


number=$RANDOM$RANDOM$RANDOM$RANDOM;
let "number %= 10000000000000";
echo $number

But sometimes it is generating negative numbers and also 15 digit numbers.
Please help me fix this or a script which works.

Thanks in Advance !

You know that these aren't true random numbers, don't you?
You cannot generate TRN without dedicated hardware like this:
Quantis RNG - True Random Number Generator - Overview.

However: are leading zeroes acceptable? Is 0123456789110077 acceptable?
If so (for 16 digits numbers):

range=10;
number="";
for i in {0..15}; do
  r=$RANDOM;
  let "r %= $range";
  number="$number""$r";
done;
echo $number

If, on the contrary, leading zeroes are not acceptable (for 16 digits numbers):

number=$RANDOM;
let "number %= 9";
let "number = number + 1";
range=10;
for i in {1..15}; do
  r=$RANDOM;
  let "r %= $range";
  number="$number""$r";
done;
echo $number

For 13 digits numbers, you can easily arrange the above solutions.
--
Bye

1 Like

Thanks Lem, that helps. Leading zeroes are acceptable.

What Shell are you using? What Operating System are you running?

The largest integer number which can be used in standard Shell arithmetic is:
((2*1024*1024*1024) -1 ) = 2147483647

This is only 10 digits and it will turn negative if you exceed that number.
Therefore if you don't have a better means of working with numbers you will need to use strings and the bc command.

Hi.

Here is a perl solution:

#!/usr/bin/env perl

# @(#) p1	Demonstrate random big integers, perl, random.org.
# Using module from cpan.org:
# Math::BigInt::Random, q.v.

use Math::BigInt;
use Math::BigInt::Random qw/ random_bigint /;

my ( $i, $number );

print "\n";
for ( $i = 1; $i <= 10; $i++ ) {
  $number = random_bigint( length => 13 );
  print " Big integer, length 13-decimal, # $i: $number\n";
}

print "\n";
for ( $i = 1; $i <= 10; $i++ ) {
  $number = random_bigint( length => 16 );
  print " Big integer, length 16-decimal, # $i: $number\n";
}

print "\n";
for ( $i = 1; $i <= 10; $i++ ) {
  $number = random_bigint( min => 1, max => 10**16 - 1 );
  print " Big integer, 1 - 2**16-1, # $i: $number\n";
}

print "\n";
for ( $i = 1; $i <= 10; $i++ ) {
  $number = random_bigint( length => 16, use_internet => 1 );
  print " Big integer, from random.org, length 16-decimal, # $i: $number\n";
}

exit(0);

producing:

% ./p1

 Big integer, length 13-decimal, # 1: 5289843301912
 Big integer, length 13-decimal, # 2: 5131901500099
 Big integer, length 13-decimal, # 3: 2395645168348
 Big integer, length 13-decimal, # 4: 5430633161141
 Big integer, length 13-decimal, # 5: 9357805637434
 Big integer, length 13-decimal, # 6: 1499363029752
 Big integer, length 13-decimal, # 7: 6054280946061
 Big integer, length 13-decimal, # 8: 3660352156516
 Big integer, length 13-decimal, # 9: 4802606276086
 Big integer, length 13-decimal, # 10: 3833418903910

 Big integer, length 16-decimal, # 1: 9705369256666533
 Big integer, length 16-decimal, # 2: 3673996578033120
 Big integer, length 16-decimal, # 3: 8091897092632003
 Big integer, length 16-decimal, # 4: 1457302007140337
 Big integer, length 16-decimal, # 5: 8014569470230008
 Big integer, length 16-decimal, # 6: 5833200500889384
 Big integer, length 16-decimal, # 7: 1796616941692496
 Big integer, length 16-decimal, # 8: 6281243514727502
 Big integer, length 16-decimal, # 9: 3166175172072335
 Big integer, length 16-decimal, # 10: 8303094662675836

 Big integer, 1 - 2**16-1, # 1: 8373969216659148
 Big integer, 1 - 2**16-1, # 2: 6546006739508046
 Big integer, 1 - 2**16-1, # 3: 1286637954039551
 Big integer, 1 - 2**16-1, # 4: 8345572676433835
 Big integer, 1 - 2**16-1, # 5: 2905925453670991
 Big integer, 1 - 2**16-1, # 6: 6195505548239626
 Big integer, 1 - 2**16-1, # 7: 2762366058433696
 Big integer, 1 - 2**16-1, # 8: 8429021814413192
 Big integer, 1 - 2**16-1, # 9: 4990069084726779
 Big integer, 1 - 2**16-1, # 10: 4516295819427199

 Big integer, from random.org, length 16-decimal, # 1: 1694345179253085
 Big integer, from random.org, length 16-decimal, # 2: 2165834290283208
 Big integer, from random.org, length 16-decimal, # 3: 2467216438238563
 Big integer, from random.org, length 16-decimal, # 4: 2204334445952010
 Big integer, from random.org, length 16-decimal, # 5: 6380334714185258
 Big integer, from random.org, length 16-decimal, # 6: 5365790761514186
 Big integer, from random.org, length 16-decimal, # 7: 6583089331520896
 Big integer, from random.org, length 16-decimal, # 8: 7352122857137993
 Big integer, from random.org, length 16-decimal, # 9: 2148627395193063
 Big integer, from random.org, length 16-decimal, # 10: 6847378193318718

The random.org source limits free bits to 1M per IP per day. So, in coding a testing this perl script, I am now down to:

Current allowance:	818,656 bits
Next free top-up:	181,344 bits
Time till next free top-up:	09:41:06	

See RANDOM.ORG - True Random Number Service for details on that aspect of truly random numbers (bits)

Best wishes ... cheers, drl

tr -dc A-Za-z0-9 </dev/urandom |  head -c 14
2 Likes

Hi, fpmurphy.

Probably a typo, I had better luck with:

tr -dc '0-9' </dev/urandom |  head -c 14

producing, for example:

63443697797894

rather than:

IzjDQNR6LxvwOE

Users should note also:

       The kernel random-number generator is designed to produce a small
       amount of high-quality seed material to seed a cryptographic pseudo-
       random number generator (CPRNG).  It is designed for security, not
       speed, and is poorly suited to generating large amounts of random data.
       Users should be very economical in the amount of seed material that
       they read from /dev/urandom (and /dev/random); unnecessarily reading
       large quantities of data from this device will have a negative impact
       on other users of the device.
excerpt from man urandom

Best wishes ... cheers, drl

If you need to generate a lot of numbers it's best to use the RANDOM shell variable: Just pick 4 4-digit random numbers and string them together:

printf "%04d%04d%04d%04d\n" $((RANDOM%10000))  $((RANDOM%10000)) $((RANDOM%10000)) $((RANDOM%10000))

Using this method you can generate a file with millions of pseudo random numbers in just a couple of minutes.

There is no one best way to generate pseudo-random numbers.