Hier der Code für eine Einzelrunde. Der Counter zählt die 1000 Miners ab (Ich wollte vorhin von 100 auf 1000 Miners erhöhen), macht die 1:10.000 Chance (Oh, ich ahtte vorhin 1:100.000 geschrieben, das war falsch, da fehlt ne 0 im Quelltext für) und wenn der Hash richtig ist (Zufallszahl=1) dann werden die Coins verteilt. Die Funktion wird einige Millionen mal aufgerufen und das Ergebnis ist dann eine gleichmäßig verteilung.
for p := 1 to 1000 do
begin
b := random(10000)+1;
// Hash loggen
inc(pools[miners[p].pool_id].hashes);
inc(pools[miners[p].pool_id].round_hashes[p]);
if b = 1 then // Chance 1:10000
begin
// Hash gefunden...
hash_sum := pools[miners[p].pool_id].hashes;
inc(pools[miners[p].pool_id].btc , 50);
for o := 1 to 1000 do
begin
if pools[miners[p].pool_id].round_hashes[o] > 0 then
begin
// User O hat mit gesucht
miners[o].btc := miners[o].btc + 50/hash_sum * pools[miners[p].pool_id].round_hashes[o];
pools[miners[p].pool_id].round_hashes[o] := 0;
end;
end;
pools[miners[p].pool_id].hashes := 0;
end;
end;
Zusätzlich werden die Miners noch regelmäßig auf die Pools verteilt mit
miners[ random(1000)+1 ].pool_id := random(10)+1;
Und zu guter letzt wird der letze Miner auf den Pool mit den wenigsten Hashes gesetzt. In meinem Beispiel die letzen zwei, ich wollt sehen, wie sich das ganze verhält wenn mehr als 1 Miner wechselt.
for p := 1 to 10 do
begin
if pools[p].hashes < hashes then
begin
hashes := pools[p].hashes;
mh := p;
end;
end;
if mh > -1 then
begin
for o := 1000 downto 999 do
begin
miners[o].pool_id := mh;
end;
end;
end;