Advertisement
Guest User

Untitled

a guest
Feb 24th, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.49 KB | None | 0 0
  1. S = 32767
  2. def f(h):
  3. total = sum(h)
  4. n = len(h)
  5. p = [ x / float(total) for x in h ]
  6. o = [ +max(x > 0, int(round(x * S))) for x in p ]
  7. errs = lambda: [ o[i] - S*p[i] for i in range(n) ]
  8. err = errs()
  9. xs = S - sum(o)
  10. def isorted(minv, rev):
  11. ii = [ i for i in range(n) if o[i] > minv ]
  12. ii.sort(key=lambda i: err[i], reverse=rev)
  13. return ii
  14. if xs >= 0:
  15. ei = isorted(0, False)
  16. for i in ei:
  17. if xs == 0 or err[i] >= 1: break
  18. xs -= 1
  19. o[i] += 1
  20. err = errs()
  21. nz = n - o.count(0)
  22. addall = xs / nz
  23. o = [ x and x + addall for x in o ]
  24. xs -= addall * nz
  25. for i in isorted(0, False)[:xs]: o[i] += 1
  26. else:
  27. xs = -xs
  28. while 1:
  29. not01 = n - o.count(0) - o.count(1)
  30. if xs < not01 or xs < 1: break
  31. addall = xs / nz
  32. o = [ x and max(x - addall, 1) for x in o ]
  33. xs = sum(o) - S
  34. for x in isorted(1, True)[:xs]:
  35. o[x] -= 1
  36. return o
  37.  
  38. def maketests():
  39. import random
  40. random.seed(0)
  41. t = []
  42. for _ in range(100):
  43. l = 1 + min(int(random.expovariate(1/100.)), 1000)
  44. t.append([int(random.expovariate(1/10.)) for _ in range(l)])
  45. return t
  46.  
  47. def score(hist, prob):
  48. return sum((p/float(0x7fff) - float(h)/sum(hist))**2 for h, p in zip(hist, prob))
  49.  
  50. print '%.17g' % sum(score(t, f(t)) for t in maketests())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement