Last active
May 24, 2018 00:36
-
-
Save beenotung/fd70fc58bb2f95b4dde205737c3f7ab1 to your computer and use it in GitHub Desktop.
Illustration of tentative RedLink lucky draw algorithm
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export let M = 0 | |
export let F = 0 | |
export type gender = 'm' | 'f' | |
export function add(gender: gender) { | |
switch (gender) { | |
case 'm': | |
return M++; | |
case 'f': | |
return F++; | |
default: | |
throw new Error('unknown gender:' + gender) | |
} | |
} | |
export function join(gender: gender) { | |
if (M === F | |
|| (M > F && gender === 'f') | |
|| (F > M && gender === 'm') | |
) { | |
return add(gender); | |
} | |
if (M * 2 === F || F * 2 === M) { | |
return; | |
} | |
let prob = (gender === 'f' ? M : F) / (M + F); | |
if (Math.random() < prob) { | |
return add(gender) | |
} | |
} | |
export function report(msg) { | |
let R = F / M; | |
if (R < 1) { | |
R = M / F | |
} | |
R = Math.round(R * 100) / 100; | |
console.log({F, M, R}, msg || '') | |
} | |
export function itr(gender: gender) { | |
let res = join(gender); | |
let msg = (res === undefined ? 'rejected' : 'accepted') + ' ' + gender; | |
report(msg); | |
} | |
export function determine(f: number, m: number) { | |
F = 0; | |
M = 0; | |
if (f === m) { | |
F = f; | |
M = m; | |
return 'all accepted'; | |
} | |
if (f > m) { | |
F = M = m; | |
f -= m; | |
m = 0; | |
} | |
if (m > f) { | |
F = M = f; | |
m -= f; | |
f = 0; | |
} | |
for (let i = 0; i < f; i++) { | |
join('f') | |
} | |
for (let i = 0; i < m; i++) { | |
join('m') | |
} | |
} | |
export function main_sample_case() { | |
let f = 50; | |
let m = 100; | |
determine(f, m); | |
report('all done'); | |
} | |
export function main_n(N?: number) { | |
for (let n = 1; !N || n < N; n++) { | |
let f = 0; | |
let m = 0; | |
for (let i = 0; i < n; i++) { | |
let gen: gender = Math.random() < 1 / 3 ? 'f' : 'm'; | |
if (gen === 'f') { | |
f++ | |
} else { | |
m++ | |
} | |
} | |
determine(f, m); | |
report({n, f, m}) | |
} | |
} | |
main_n(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment