即便起跑时完全一样,最终也还是会不同

原创 tombkeeper 皮相 2022-06-30 21:21 北京

TK Monkey

20 只猴,每只猴都有 20 根香蕉,然后每天随机把一根香蕉给其他猴

01530601001234567891011121314151617181920
文章来源:即便起跑时完全一样,最终也还是会不同图表代码来源于此链接,可在线执行

实现

GET
tombkeeper原著
// 我一直想尝试把写作和写程序结合起来。
//
// 前阵子看到一篇文章。大致意思是即使人的天赋完全相同,背景完全相同,财
// 富分配完全随机,最终也仍然会产生贫富差距。
//
// 已经有人用 R 语言对这个问题进行了模拟。但绝大部分人都没有执行 R 语言
// 程序的条件,无法体验模拟的过程。所以我写了这个 JavaScript 程序。任何
// 人只需要打开 Chrome 或 Edge 浏览器,然后同时按下 Ctrl + Shift + J 三
// 个按键,把这个程序复制粘贴到出现的控制台中,再按下回车,就可以看到程
// 序执行的结果。
//
// 好,现在让我们开始。

// 有一间屋子,屋里有 20 只猴。
var apes = new Array(20);

// 每只猴都有 20 根香蕉。
for (var i=0; i<apes.length; i++){
    apes[i] = 20;
}

// 这间屋子里每天都会进行一次香蕉的重分配。在每次分配中,每只猴拿出一根
// 香蕉给随机的另一只猴。如果某只猴已经没有香蕉了,就不必再给别的猴香蕉。
// 这个慈悲的程序不会让猴负债,而且还允许穷光蛋猴有机会拿其它猴给的香蕉。
// 我们先看看这样持续 20 年会怎么样。
for (var i=0; i<365*20; i++){
    for (var j=0; j<apes.length; j++){
        if (apes[j]!=0){
            apes[j] -= 1;
            apes[god(0, apes.length-1, j)] += 1;
        }
    }
}
// 下面这个函数就是猴子屋的上帝,会决定每次把香蕉给谁。
// (其实就是随机返回一个不小于 min、不大于 max 且不等于 exclude 的整数)
function god(min, max, exclude) {
    var i;
    min = Math.ceil(min);
    max = Math.floor(max);
    do { i = Math.floor(Math.random() * (max - min + 1)) + min }
    while (i == exclude)
    return i;
}

// 好,现在 20 年已经过去了。我们按照目前香蕉的多少从低到高排个序。
apes.sort((a, b) => a - b);

// 然后看看现在每个猴子有多少香蕉。我们可以直接显示数字。
// apes.forEach(money => console.log(money));
// 但用柱状图会更直观一些。
apes.forEach(money => console.log('-'.repeat(money), money));

// 因为分配是随机的,所以程序每次执行的结果都不同。但总趋势都是类似的。
// 下面是我这里的一次执行结果:
// -- 2
// --- 3
// ---- 4
// ----- 5
// ----- 5
// ------ 6
// ------- 7
// ---------- 10
// ---------- 10
// ----------- 11
// ------------- 13
// ---------------- 16
// ----------------- 17
// -------------------- 20
// ------------------------- 25
// ------------------------------------- 37
// -------------------------------------------- 44
// ------------------------------------------------ 48
// -------------------------------------------------------- 56
// ------------------------------------------------------------- 61

Was this page helpful?