Hello,
The problem was with the "write" thread which wrote the numbers to the
screen, it would keep writing the same numbers because the other threads
didn't run yet. Now the write thread waits until the number generator
threads have at least run a little bit, which is done via the booleans.
So this small modification should now fix the algorithm and produce much
better random numbers, no more many duplicates !
Give it a try and do some analyzing ! Could be interesting !

=D
program ProjectTest3;
{$APPTYPE CONSOLE}
// Skybuck's "pseudo (?) random number generator" based on concurrency/race
conditions.
// I shall call it: "Skybuck's Racing Random Number Generator"
// Now it's up to the "experts" to proof it's not random.
// Now it's up to the "experts" to predict the next generated random number.
// That would be impressive which means I don't believe it's possible

=D
// duplicate numbers are prevented by taking the result from thread 1 and
thread 2 when both have run.
// interestingly enough the numbers do seem to be random on different runs !

=D
// v3
uses
SysUtils,
Classes;
var
Done1 : boolean;
Done2 : boolean;
vLehmerRandSeed : integer = 0;
vLehmerMultiplierA : integer = $08088405; // delphi's random parameter
vLehmerAdditiveConstantC : integer = $1; // delphi's random parameter
ParaLehmerModulesM : integer;
RandomNumber : integer;
type
Ttest1 = class(Tthread)
private
protected
procedure Execute; override;
public
end;
procedure Ttest1.Execute;
begin
while not terminated do
begin
{$RANGECHECKS OFF}
{$OVERFLOWCHECKS OFF}
vLehmerRandSeed := vLehmerRandSeed * vLehmerMultiplierA;
vLehmerRandSeed := vLehmerRandSeed + vLehmerAdditiveConstantC;
RandomNumber := ( int64( longword(ParaLehmerModulesM) ) * int64(
longword(vLehmerRandSeed) ) ) shr 32; // shift upper 32 bits to lower 32
bits.
{$OVERFLOWCHECKS ON}
{$RANGECHECKS ON}
Done1 := true;
end;
end;
type
Ttest2 = class(Tthread)
private
protected
procedure Execute; override;
public
end;
procedure Ttest2.Execute;
begin
while not terminated do
begin
{$RANGECHECKS OFF}
{$OVERFLOWCHECKS OFF}
vLehmerRandSeed := vLehmerRandSeed * vLehmerMultiplierA;
vLehmerRandSeed := vLehmerRandSeed + vLehmerAdditiveConstantC;
RandomNumber := ( int64( longword(ParaLehmerModulesM) ) * int64(
longword(vLehmerRandSeed) ) ) shr 32; // shift upper 32 bits to lower 32
bits.
{$OVERFLOWCHECKS ON}
{$RANGECHECKS ON}
Done2 := true;
end;
end;
type
Ttest3 = class(Tthread)
private
protected
procedure Execute; override;
public
end;
procedure Ttest3.Execute;
var
i : integer;
begin
i := 0;
while not terminated do
begin
if Done1 and Done2 then // wait until both threads are done for good mix.
begin
if i < 100 then
begin
writeln('Number ', i, ': ', RandomNumber );
i := i + 1;
end;
// now prevent writing the same numbers by setting booleans to false
// this forces the other threads to have been run a few times first
// which prevents duplicates.
Done1 := false;
Done2 := false;
end;
end;
end;
var
Test1 : Ttest1;
Test2 : Ttest2;
Test3 : Ttest3;
begin
ParaLehmerModulesM := 2000000;
Test1 := Ttest1.Create( true );
Test2 := Ttest2.Create( true );
Test3 := Ttest3.Create( true );
writeln('press enter to start');
readln;
Test1.Resume;
Test2.Resume;
Test3.Resume;
writeln('press enter to stop');
readln;
Test1.Terminate;
Test2.Terminate;
Test3.Terminate;
Test1.WaitFor;
Test2.WaitFor;
Test3.WaitFor;
Test1.Free;
Test2.Free;
Test3.Free;
writeln('press enter to exit');
readln;
end.
{
First run:
Number 0: 591661
Number 1: 1383717
Number 2: 55425
Number 3: 1716193
Number 4: 1110588
Number 5: 178207
Number 6: 412599
Number 7: 885982
Number 8: 1298636
Number 9: 1345751
Number 10: 951115
Number 11: 567914
Number 12: 1438761
Number 13: 1975649
Number 14: 1179152
Number 15: 1188244
Number 16: 1316454
Number 17: 478399
Number 18: 588773
Number 19: 1449101
Number 20: 1782394
Number 21: 1450837
Number 22: 1412242
Number 23: 1958802
Number 24: 706453
Number 25: 1782788
Number 26: 1699169
Number 27: 1817297
Number 28: 1784603
Number 29: 460392
Number 30: 1071102
Number 31: 1265793
Number 32: 825621
Number 33: 1450705
Number 34: 1801089
Number 35: 1684760
Number 36: 1372617
Number 37: 944852
Number 38: 1073702
Number 39: 1425789
Number 40: 1714585
Number 41: 84531
Number 42: 883340
Number 43: 385843
Number 44: 1324871
Number 45: 1919535
Number 46: 169568
Number 47: 987892
Number 48: 1773056
Number 49: 1894215
Number 50: 168345
Number 51: 1558135
Number 52: 170659
Number 53: 1485408
Number 54: 650291
Number 55: 821355
Number 56: 504220
Number 57: 1459369
Number 58: 1382917
Number 59: 1248006
Number 60: 281447
Number 61: 1976216
Number 62: 597790
Number 63: 1206968
Number 64: 1012088
Number 65: 1007370
Number 66: 460146
Number 67: 369452
Number 68: 1472750
Number 69: 1741023
Number 70: 1124956
Number 71: 579444
Number 72: 925109
Number 73: 1954437
Number 74: 1791697
Number 75: 1221348
Number 76: 1400944
Number 77: 1090183
Number 78: 1909185
Number 79: 1754568
Number 80: 1975557
Number 81: 1966625
Number 82: 1407632
Number 83: 1000460
Number 84: 477043
Number 85: 1980560
Number 86: 847194
Number 87: 1625909
Number 88: 961493
Number 89: 534982
Number 90: 796648
Number 91: 601776
Number 92: 1758729
Number 93: 943836
Number 94: 1342188
Number 95: 593706
Number 96: 1566457
Number 97: 1689639
Number 98: 558203
Number 99: 1063754
Second run:
Number 0: 281194
Number 1: 1621131
Number 2: 588727
Number 3: 791944
Number 4: 977046
Number 5: 1894343
Number 6: 1198558
Number 7: 784820
Number 8: 230340
Number 9: 372705
Number 10: 211569
Number 11: 1413320
Number 12: 1036561
Number 13: 1281572
Number 14: 855929
Number 15: 67321
Number 16: 1730538
Number 17: 55501
Number 18: 596598
Number 19: 1852337
Number 20: 1595216
Number 21: 1177584
Number 22: 261003
Number 23: 1138416
Number 24: 1624625
Number 25: 892191
Number 26: 1835476
Number 27: 693223
Number 28: 1672337
Number 29: 1081086
Number 30: 171856
Number 31: 1859310
Number 32: 1826819
Number 33: 819557
Number 34: 1187465
Number 35: 1268580
Number 36: 1444621
Number 37: 926093
Number 38: 1435450
Number 39: 1875381
Number 40: 1964759
Number 41: 1492628
Number 42: 629905
Number 43: 1223551
Number 44: 1701942
Number 45: 1430186
Number 46: 1455564
Number 47: 833894
Number 48: 396754
Number 49: 584681
Number 50: 1479419
Number 51: 1791494
Number 52: 1075978
Number 53: 83511
Number 54: 333557
Number 55: 1186923
Number 56: 1189176
Number 57: 384811
Number 58: 842413
Number 59: 1575325
Number 60: 219042
Number 61: 1926040
Number 62: 1793956
Number 63: 568932
Number 64: 1257310
Number 65: 1942319
Number 66: 186415
Number 67: 1460770
Number 68: 837544
Number 69: 526578
Number 70: 631263
Number 71: 1647995
Number 72: 1552406
Number 73: 1789426
Number 74: 1563067
Number 75: 1428944
Number 76: 404380
Number 77: 781447
Number 78: 586741
Number 79: 822521
Number 80: 1904219
Number 81: 1816111
Number 82: 1528073
Number 83: 1222368
Number 84: 986158
Number 85: 1744271
Number 86: 1393829
Number 87: 1257212
Number 88: 137066
Number 89: 1117157
Number 90: 974501
Number 91: 1075550
Number 92: 1497516
Number 93: 1011126
Number 94: 1231837
Number 95: 397440
Number 96: 168001
Number 97: 1674372
Number 98: 419817
Number 99: 580721
Third run:
press enter to start
press enter to stop
Number 0: 1127368
Number 1: 1861336
Number 2: 200579
Number 3: 919461
Number 4: 1325393
Number 5: 235788
Number 6: 1385082
Number 7: 710515
Number 8: 372409
Number 9: 53656
Number 10: 1802735
Number 11: 1303214
Number 12: 444883
Number 13: 1842524
Number 14: 663743
Number 15: 796749
Number 16: 1020100
Number 17: 765427
Number 18: 1567388
Number 19: 762891
Number 20: 1875374
Number 21: 141281
Number 22: 1072721
Number 23: 861767
Number 24: 1505756
Number 25: 1492978
Number 26: 1136535
Number 27: 1344103
Number 28: 99564
Number 29: 1081327
Number 30: 1890092
Number 31: 201986
Number 32: 819531
Number 33: 663887
Number 34: 73381
Number 35: 890780
Number 36: 1815205
Number 37: 1739626
Number 38: 854664
Number 39: 1891111
Number 40: 776294
Number 41: 717348
Number 42: 736007
Number 43: 1297839
Number 44: 1075524
Number 45: 1048435
Number 46: 238541
Number 47: 906972
Number 48: 1822199
Number 49: 1595778
Number 50: 504827
Number 51: 336134
Number 52: 79638
Number 53: 451789
Number 54: 19788
Number 55: 1694109
Number 56: 1620422
Number 57: 842710
Number 58: 1784952
Number 59: 162821
Number 60: 685845
Number 61: 1364543
Number 62: 1258526
Number 63: 1350227
Number 64: 708092
Number 65: 766155
Number 66: 99934
Number 67: 577349
Number 68: 767099
Number 69: 839082
Number 70: 146038
Number 71: 1120110
Number 72: 1792050
Number 73: 1578237
Number 74: 519435
Number 75: 384586
Number 76: 1980275
Number 77: 412501
Number 78: 1839577
Number 79: 858070
Number 80: 1001597
Number 81: 524893
Number 82: 113754
Number 83: 1691114
Number 84: 765809
Number 85: 1285345
Number 86: 1242773
Number 87: 1661729
Number 88: 518079
Number 89: 267756
Number 90: 1115837
Number 91: 1632180
Number 92: 1533055
Number 93: 254998
Number 94: 1781603
Number 95: 381405
Number 96: 996179
Number 97: 1754414
Number 98: 1858042
Number 99: 1254092
}
Bye,
Skybuck.