This is just a comment, but he needs space. I manually added padding and comments to the DotLisp code only in the SO text box. The code is identical, except if it uses (.Next (Random. i)) as a seed, or simply uses i as a seed itself and whether it checks the third or fourth random .Next case.
I did not check again right now, but I believe that every .Next x always extracts one new pattern and converts the result to something between 0 and x-1 .
The use of x = (* 15 183) = 2745 happened because, looking at smaller ranges and more similar to 10000 seeds, I found that the third .Next x was "uniform" random, but with two "uniformity" speeds; a smaller range of smaller selected values ranged from 177 to 190 adjacent numbers. (You can see this by calling (print-histo h) on the last line, but decrease the number of seeds tested :-)) When I increased the number of seeds, I increased this range.
The code simply accumulates a counter for each .Next x result and displays the counter of these counters. For a true uniform random .Next x this should lead to a good bell curve, as seen from the latter case (fourth .Next , consecutive seeds).
(let (h (Hashtable.)) (dotimes i 6553600 (lets (s (.Next (Random. i)) r (Random. s)) ; using random seed (dotimes j 2 r.Next) ; skipping 2 results (let (x (r.Next (* 15 183))) (xh (+ 1 (or (xh) 0)))))) (print-histo (histo h.Values)))
1 2368 3 2369 11 2370 20 2371 11 2372 12 2373 17 2374 15 2375 8 2376 13 2377 20 2378 11 2379 3 2380 8 2382 94 2383 253 2384 296 2385 240 2386 248 2387 238 2388 233 2389 252 2390 236 2391 321 2392 163 2393 18 2394
A beveled bell curve and another small flat bell curve or just a very uneven tail.
(let (h (Hashtable.)) (dotimes i 6553600 (lets (s (.Next (Random. i)) r (Random. s)) ; using random seed (dotimes j 3 r.Next) ; skipping 3 results (let (x (r.Next (* 15 183))) (xh (+ 1 (or (xh) 0)))))) (print-histo (histo h.Values)))
11 2377 43 2378 90 2379 114 2380 138 2381 133 2382 132 2383 143 2384 127 2385 147 2386 130 2387 136 2388 145 2389 223 2390 430 2391 354 2392 177 2393 72 2394
Two curved bells with one wide and one narrow.
(let (h (Hashtable.)) (dotimes i 6553600 (let (r (Random. i)) ; using sequential seed (dotimes j 2 r.Next) ; skipping 2 results (let (x (r.Next (* 15 183))) (xh (+ 1 (or (xh) 0)))))) (print-histo (histo h.Values)))
12 2380 104 2381 143 2382 123 2383 106 2384 55 2385 115 2386 387 2387 511 2388 537 2389 454 2390 194 2391 4 2392
Effectively two curved bells.
(let (h (Hashtable.)) (dotimes i 6553600 (let (r (Random. i)) ; using sequential seed (dotimes j 3 r.Next) ; skipping 3 results (let (x (r.Next (* 15 183))) (xh (+ 1 (or (xh) 0)))))) (print-histo (histo h.Values)))
18 2384 154 2385 432 2386 758 2387 798 2388 477 2389 105 2390 3 2391
Finally, a simple bell curve.
In general, it seems that there are two separate questions: the third sample is not very uniform at all, and the seeds created in the first sample either emphasize the problem or show a separate problem.