Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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();
Add Comment
Please, Sign In to add comment