I am sure this will make some of you happy...
Mueslo - I finally just took your numpy.random.exponential and replaced my poisson function with it, in my own simulation. When I did, numbers started coming out looking like they should (actual return close to expected). This backed your claim that my distribution was wrong. As I started generating plots of each distribution, things started to make sense.
As hard as I've been dug in on this, most people would just bug out, but it wouldn't be right for me to not tell you that you were right on the distribution. H2O tried to explain this to me too, and a couple others.
My mental roadblock (or rather what cleared it) was the fact that even in a lopsided distribution you can still have an average, but it will be very skewed toward the thick end of the plot. I needed to actually see it plotted before it clicked.
But, my simulation was still correct (yours was too), less the distribution, so I guess I learned I'm better at programming than math :p
Anyway, thanks for actually trying to explain things to me and not being an ass like a couple others. I learned quite a bit researching all of this.
For the record:
import random
import numpy as np
import numpy.random as rnd
class worker():
def __init__(self,hashrate):
self.hashrate = hashrate
self.sharesolvetime = 60 / hashrate
self.shares = 0
class pool():
def __init__(self,blockfindtime):
self.blockfindtime = blockfindtime
pool1 = pool(30)
worker1 = worker(1)
worker2 = worker(12)
samplesize = 1000000
for n in range(0,samplesize):
clock = rnd.exponential(scale=pool1.blockfindtime)
clock1 = clock
while clock1 > 0:
sharesolve = rnd.exponential(scale=worker1.sharesolvetime)
if sharesolve > clock1:
break
else:
worker1.shares = worker1.shares + 1
clock1 = clock1 - sharesolve
clock2 = clock
while clock2 > 0:
sharesolve = rnd.exponential(scale=worker2.sharesolvetime)
if sharesolve > clock2:
break
else:
worker2.shares = worker2.shares + 1
clock2 = clock2 - sharesolve
print "Worker 1 has: " + str((float(worker1.hashrate) / float(worker2.hashrate + worker1.hashrate)) * 100) + ' percent of the hash power'
print "But worker 1 has: " + str((float(worker1.shares) / float(worker2.shares + worker1.shares)) * 100) + ' percent of the profit'
print "Over sample size of " + str(samplesize)
print "When worker1's average share-find-speed was: " + str((float(pool1.blockfindtime) / float(worker1.sharesolvetime))) + 'X the block-find-speed'
Very Slow
Worker 1 has: 7.69230769231 percent of the hash power
But worker 1 has: 7.69363865886 percent of the profit
Over sample size of 1000000
When worker1's average share-find-speed was: 8.33333333333X the block-find-speed
Slow
Worker 1 has: 7.69230769231 percent of the hash power
But worker 1 has: 7.6898534448 percent of the profit
Over sample size of 1000000
When worker1's average share-find-speed was: 4.0X the block-find-speed
Medium
Worker 1 has: 7.69230769231 percent of the hash power
But worker 1 has: 7.68459728742 percent of the profit
Over sample size of 1000000
When worker1's average share-find-speed was: 2.0X the block-find-speed
Fast
Worker 1 has: 7.69230769231 percent of the hash power
But worker 1 has: 7.68286758249 percent of the profit
Over sample size of 1000000
When worker1's average share-find-speed was: 1.0X the block-find-speed
Very Fast
Worker 1 has: 7.69230769231 percent of the hash power
But worker 1 has: 7.67015222587 percent of the profit
Over sample size of 1000000
When worker1's average share-find-speed was: 0.5X the block-find-speed