| | 1 | /* |
| | 2 | * random number generator test |
| | 3 | */ |
| | 4 | |
| | 5 | #include "tads.h" |
| | 6 | #include "t3.h" |
| | 7 | |
| | 8 | class Throwable: object |
| | 9 | // basic exception class |
| | 10 | display = "basic exception object"; |
| | 11 | ; |
| | 12 | |
| | 13 | class RuntimeError: Throwable |
| | 14 | construct(errno, ...) { errno_ = errno; } |
| | 15 | errno_ = 0 |
| | 16 | display = "RuntimeError: error = <<errno_>>" |
| | 17 | ; |
| | 18 | |
| | 19 | _say_embed(str) { tadsSay(str); } |
| | 20 | |
| | 21 | _main(args) |
| | 22 | { |
| | 23 | t3SetSay(_say_embed); |
| | 24 | try |
| | 25 | { |
| | 26 | main(); |
| | 27 | } |
| | 28 | catch (Throwable th) |
| | 29 | { |
| | 30 | "\n\n*** Unhandled exception: << th.display >>\n"; |
| | 31 | } |
| | 32 | } |
| | 33 | |
| | 34 | main() |
| | 35 | { |
| | 36 | local i; |
| | 37 | local buckets = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; |
| | 38 | |
| | 39 | randomize(); |
| | 40 | |
| | 41 | "Generating random numbers from 1 to 10...\n"; |
| | 42 | for (i = 0 ; i < 10000 ; ++i) |
| | 43 | { |
| | 44 | local val; |
| | 45 | |
| | 46 | val = rand(10) + 1; |
| | 47 | ++buckets[val]; |
| | 48 | } |
| | 49 | |
| | 50 | i = i * 3; |
| | 51 | "Number of values at each integer:\n"; |
| | 52 | for (i = 1 ; i <= 10 ; ++i) |
| | 53 | " <<i>>: <<buckets[i]>>\n"; |
| | 54 | "\n"; |
| | 55 | |
| | 56 | local num_names = ['one', 'two', 'three', 'four', 'five', |
| | 57 | 'six', 'seven', 'eight', 'nine', 'ten']; |
| | 58 | "Picking random list elements\n"; |
| | 59 | for (i = 0 ; i < 100 ; ++i) |
| | 60 | "<<rand(num_names)>>, "; |
| | 61 | "\n\n"; |
| | 62 | |
| | 63 | "Picking random arguments\n"; |
| | 64 | for (i = 0 ; i < 100 ; ++i) |
| | 65 | "<<rand('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', |
| | 66 | 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', |
| | 67 | 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')>>, "; |
| | 68 | "\n\n"; |
| | 69 | |
| | 70 | "Pick some 0/1 values...\n"; |
| | 71 | buckets = [0, 0]; |
| | 72 | for (i = 0 ; i < 1000 ; ++i) |
| | 73 | { |
| | 74 | local val; |
| | 75 | |
| | 76 | val = rand(2); |
| | 77 | "<<val>>"; |
| | 78 | buckets[val+1]++; |
| | 79 | } |
| | 80 | "\n0's: <<buckets[1]>>; 1's: <<buckets[2]>>\n\n"; |
| | 81 | |
| | 82 | #if 0 |
| | 83 | "Pick some 0/1 values from middle bits...\n"; |
| | 84 | buckets = [0, 0]; |
| | 85 | for (i = 0 ; i < 1000 ; ++i) |
| | 86 | { |
| | 87 | local val; |
| | 88 | |
| | 89 | val = (rand(128) >> 6) & 1; |
| | 90 | "<<val>>"; |
| | 91 | buckets[val+1]++; |
| | 92 | } |
| | 93 | "\n0's: <<buckets[1]>>; 1's: <<buckets[2]>>\n\n"; |
| | 94 | |
| | 95 | "Pick some using sequence shortening\n"; |
| | 96 | buckets = [0, 0]; |
| | 97 | for (i = 0, local lastval = 0, local seqlen = 0 ; i < 1000 ; ++i) |
| | 98 | { |
| | 99 | local val; |
| | 100 | |
| | 101 | val = rand(2); |
| | 102 | if (val == lastval) |
| | 103 | { |
| | 104 | ++seqlen; |
| | 105 | if (rand(100) < seqlen * 15) |
| | 106 | { |
| | 107 | val = 1 - lastval; |
| | 108 | seqlen = 0; |
| | 109 | } |
| | 110 | } |
| | 111 | else |
| | 112 | { |
| | 113 | seqlen = 0; |
| | 114 | } |
| | 115 | lastval = val; |
| | 116 | "<<val>>"; |
| | 117 | buckets[val+1]++; |
| | 118 | } |
| | 119 | "\n0's: <<buckets[1]>>; 1's: <<buckets[2]>>\n\n"; |
| | 120 | #endif |
| | 121 | } |
| | 122 | |