f4f110b41df465cb0fe49cc72c4de8a13b6dac3e
[platform/upstream/coreutils.git] / tests / sort-time / rand-gen
1 #! /p/bin/perl -w
2 # Print n pairs of floating point values.
3 # Each value is in the range [0,1).
4 # Usage: rand n
5
6 # Use only the basename from the path to this executable in error messages.
7 ($program_name = $0) =~ s|.*/||;
8
9 require 'newgetopt.pl';
10 $MAXINT = 0x7fffffff;
11
12 undef $opt_help;
13 undef $opt_verbose;
14 undef $opt_integer;
15 &usage if (&NGetOpt(('seed=i', 'range=s', 'help', 'items-per-line=i',
16                      'format=s', 'integer', 'verbose')) == 0);
17
18 &usage if (defined ($opt_help));
19
20 &usage if (scalar (@ARGV) != 1 || $ARGV[0] !~ /^[0-9]+$/);
21 $n = $ARGV[0];
22
23 if (!defined ($opt_seed))
24   {
25     $opt_seed = time;
26     print STDERR "seed= $opt_seed\n" if (defined ($opt_verbose));
27   }
28
29 srand ($opt_seed);
30
31 # FIXME: make sure this number is positive.
32 $opt_items_per_line = 1 if (!defined ($opt_items_per_line));
33
34 if (defined ($opt_integer))
35   {
36     $opt_format = "%d" if (!defined ($opt_format));
37     if (defined ($opt_range))
38       {
39         # FIXME: allow FP endpoints even though --integer specified?
40         if ($opt_range =~ /^([0-9]+),([0-9]+)$/)
41           {
42             $lo = $1;
43             $hi = $2;
44           }
45         else
46           {
47             print STDERR ("bad argument `$opt_range' to --range option\n");
48             exit 2;
49           }
50       }
51     else
52       {
53         $lo = 0;
54         $hi = $MAXINT;
55       }
56
57     # Increase by one because we'll have to truncate to get integers.
58     $hi += 1;
59   }
60 else
61   {
62     $opt_format = "%.15g" if (!defined ($opt_format));
63     if (defined ($opt_range))
64       {
65         if ($opt_range =~ /^(-?[0-9.]+),(-?[0-9.]+)$/)
66           {
67             $lo = $1;
68             $hi = $2;
69           }
70         else
71           {
72             print STDERR ("bad argument `$opt_range' to --range option\n");
73             exit 2;
74           }
75       }
76     else
77       {
78         $lo = 0.0;
79         $hi = 1.0;
80       }
81   }
82
83 # FIXME: warn if lo > hi.
84
85 $range = $hi - $lo;
86
87 if ($opt_items_per_line == 1)
88   {
89     for ($i=0; $i < $n; $i++)
90       {
91         printf $opt_format, $lo + rand($range);
92         print "\n";
93       }
94   }
95 else
96   {
97     $separator = ' ';
98     for ($i=0; $i < $n; $i++)
99       {
100         for ($j=0; $j < $opt_items_per_line; $j++)
101           {
102             printf $opt_format, $lo + rand($range);
103             print $j == $opt_items_per_line - 1 ? "\n" : $separator;
104           }
105       }
106   }
107
108 exit 0;
109
110 sub usage
111 {
112   print STDERR <<EOF;
113 Usage: $program_name [OPTIONS] n
114     --help
115     --seed=n
116     --integer
117     --items-per-line=n
118     --range=i,j e.g. 3,9  or 1.5,33.9
119     --format='%3d'
120     --verbose (report the seed if it gets default value)
121 EOF
122   exit 2;
123 }