GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
ignuin.f
Go to the documentation of this file.
1 INTEGER*4 FUNCTION ignuin(low,high)
2C**********************************************************************
3C
4C INTEGER*4 FUNCTION IGNUIN( LOW, HIGH )
5C
6C GeNerate Uniform INteger
7C
8C
9C Function
10C
11C
12C Generates an integer uniformly distributed between LOW and HIGH.
13C
14C
15C Arguments
16C
17C
18C LOW --> Low bound (inclusive) on integer value to be generated
19C INTEGER LOW
20C
21C HIGH --> High bound (inclusive) on integer value to be generated
22C INTEGER HIGH
23C
24C
25C Note
26C
27C
28C If (HIGH-LOW) > 2,147,483,561 prints error message on * unit and
29C stops the program.
30C
31C**********************************************************************
32
33C IGNLGI generates integers between 1 and 2147483562
34C MAXNUM is 1 less than maximum generable value
35C .. Parameters ..
36 INTEGER*4 maxnum
37 parameter(maxnum=2147483561)
38 CHARACTER*(*) err1,err2
39 parameter(err1='LOW > HIGH in IGNUIN',
40 + err2=' ( HIGH - LOW ) > 2,147,483,561 in IGNUIN')
41C ..
42C .. Scalar Arguments ..
43 INTEGER*4 high,low
44C ..
45C .. Local Scalars ..
46 INTEGER*4 err,ign,maxnow,range,ranp1
47C ..
48C .. External Functions ..
49 INTEGER*4 ignlgi
50 EXTERNAL ignlgi
51C ..
52C .. Intrinsic Functions ..
53 INTRINSIC mod
54C ..
55C .. Executable Statements ..
56 IF (.NOT. (low.GT.high)) GO TO 10
57 err = 1
58C ABORT-PROGRAM
59 GO TO 80
60
61 10 range = high - low
62 IF (.NOT. (range.GT.maxnum)) GO TO 20
63 err = 2
64C ABORT-PROGRAM
65 GO TO 80
66
67 20 IF (.NOT. (low.EQ.high)) GO TO 30
68 ignuin = low
69 RETURN
70
71C Number to be generated should be in range 0..RANGE
72C Set MAXNOW so that the number of integers in 0..MAXNOW is an
73C integral multiple of the number in 0..RANGE
74
75 30 ranp1 = range + 1
76 maxnow = (maxnum/ranp1)*ranp1
77 40 ign = ignlgi() - 1
78 IF (.NOT. (ign.LE.maxnow)) GO TO 40
79 ignuin = low + mod(ign,ranp1)
80 RETURN
81
82 80 IF (.NOT. (err.EQ.1)) GO TO 90
83 WRITE (*,*) err1
84 GO TO 100
85
86C TO ABORT-PROGRAM
87 90 WRITE (*,*) err2
88 100 WRITE (*,*) ' LOW: ',low,' HIGH: ',high
89 WRITE (*,*) ' Abort on Fatal ERROR'
90 IF (.NOT. (err.EQ.1)) GO TO 110
91 CALL xstopx ('LOW > HIGH in IGNUIN')
92
93 110 CALL xstopx (' ( HIGH - LOW ) > 2,147,483,561 in IGNUIN')
94
95 120 END
integer *4 function ignlgi()
Definition ignlgi.f:2
integer *4 function ignuin(low, high)
Definition ignuin.f:2
T mod(T x, T y)
Definition lo-mappers.h:294