program genRandom(input, output); { LA 1/2003: rough and ready data generator } const length = 1000000; { output length } ranRange = 52; { range of random number gen; 26+ ~ skewness } chRange = 26; { range of legit chars ABCD..., max = 26 } seed0 = 57413; var seed:integer; { seed needed by generator } i, r, preferN :integer; preferS : set of char; preferA : array[0..100] of char; ch : char; count : array [char] of integer; function random( n:integer ):integer; {Linear Congruential Pseudo Random Number Generator} {see D.E.Knuth The Art of Computer Programming V2 } { Addison Wesley 1969 } {bottom 15 bits are random, `mod' the output for a smaller result } {guaranteed not to overflow on a 32 bit computer } {BUT BEWARE a 15-bit linear congrunetial generator is not very random !!! } {and the cycle length is only 32K. } var r:integer; begin seed := (seed * (1 + 4*37*109) + 9999) mod (32 * 1024); { suitable for a Vax } r:= trunc( seed/(32*1024-1) * n); if r = n then r:=random(n); random := r end {random}; {-----------------------------------------------------------------------------} begin seed := seed0; preferS := ['A', 'E', 'I', 'O', 'U']; { preferred characters } for ch := chr(0) to chr(128) do count[ch] := 0; preferN := 0; for ch := 'A' to 'Z' do if ch in preferS then begin preferA[preferN] := ch; preferN := preferN+1 end; for i := 1 to length do begin r := random(ranRange); if ((i < length/3) or (i > 2*length/3)) and (r >= chRange) then r := random(ranRange); { i.e. less pref chars near the ends } if r < chRange then ch := chr( ord('A') + r ) else ch := preferA[(r-chRange) mod preferN]; count[ch] := count[ch]+1; write(ch); if i mod 50 = 0 then writeln else if i mod 10 = 0 then write(' ') end; for ch := chr(0) to chr(128) do if count[ch] > 0 then write(ch, ':', count[ch]:1, ' '); writeln end.