スタートが完全に平等で、

誰も誰の持ち物を奪わない公正な社会があったとしても、

それでもやはり格差は発生してしまう。

ことをデモするシミュレーションを作りました。

まずシミュレートする世界ですが、なんと一次元です。

二次元のフラットランドに対し、一次元なのでストレートランドという名前がついています。

世界も住民も線分で、世界のはじまりにおいて住民は全く同じ長さの線分として誕生します。

住民の「食糧」は、この線分世界に均等な確率で出現する「点」です。マナとでもいいましょうか。たまたまこの点と交わる住民が、このマナを手に入れます。

マナを食した住民は大きくなります。線分なので「長く」なります。食べ損ねた住民は「短く」なります。

住民同士はマナをめぐって争うことは一切ありません。ただ自分のところに出現したマナを食べるだけです。

それでは、実際に見ていただきましょう。時がたつにつれてこの世界がどう変わっていくかを。ここで世界全体は長さ100の線分で、これを10人の住民が均等にわけています。住民は一サイクルに長さ1だけ短くなりますが、マナを一つ食べると長さが1増えます。マナは世界の大きさが変わらないよう、常に1サイクルにつき住民の数だけ出現します。

どうなったでしょうか?

時が経つにつれ住民の数は減っていき、最後は一人になってしまいます。どの住民が最後の一人になるかはシミュレーションの都度変わりますし、最後の一人になるのにどれだけの時間がかかるかもまた決まっていませんが、それでも必ず持てる住民と持たざる住民が出現して、持ち物がゼロになった時点でその住民は世界から消えていき、最後に残るのは一人なのです。

なぜ、こうなってしまうのでしょう?

ポイントは二つ。確率と時間です。

マナは世界のどこにも確率論的に均等に現れますが、あくまで個々の出現はランダムです。個々のサイクルでは二つマナを得る人もいれば、一つも得られない人も出るというわけです。

二つ得た人は自分が世界に占める割合が1増え、そして一つも得られなかった人は1減る。そしてマナを得る確率というのは、世界に対し自分がどれだけの割合を占めるかで決まるので、伸びた人はその分次にマナを得る確率も高くなり、縮んだ人はその分低くなる。

こうしてわずかな格差があっという魔に拡大される、というわけです。

これよりもずっと複雑な我々の宇宙も、これによく似ています。COBEとWMAPによれば、宇宙開闢時の「ゆらぎ」は10万分の1だったそうです。しかし開闢後137億年たった今では、超銀河団とグレート・ヴォイドがあり、その超銀河団の中にも大きな銀河も小さな銀河もあり、その銀河も中心のブラックホールから褐色矮星までありという具合にありとあらゆるスケールにおいて「格差」が見られます。そしてこの傾向は宇宙が年を重ねるごとに大きくなっているのです。

ここでは格差の是非については問いません。おそらく別entryを充てることになるでしょう。一言だけつけくわえるのだとしたら、最後の一人はそういう世界に住みたいと思うのだろうかということでしょうか。

Dan the Man with More Dimensions to Explore

JS Source

(function(d){

var people = [];
var ipop = 10, pop;
var world = d.getElementById('world');
var colors = [
  '#ccc', '#8cc', '#c8c', '#cc8', '#c88', '#8c8', '#88c', '#888', '#844', '#848'
];

init = function(){
  ipop = 10;
  d.getElementById('world').innerHTML=''
  for (var i = 0; i < 10; i++) people[i] = 10;
  show();
};

show = function(){
  var gen = d.createElement('div');
  gen.style.clear = 'both';
  for (var i = 0; i < ipop; i++){
    if (!people[i]) continue;
    var person = d.createElement('span');
    person.innerHTML = ' ';
    person.style.display = 'inline-block';
    person.style.width = people[i] * 4;
    person.style.height = 4;
    person.style.backgroundColor = colors[i];
    person.style.float = 'left';
    gen.appendChild(person);
  }
  world.appendChild(gen);
}

next = function(){
  var feed = [];
  pop = 0;
  for (var i = 0; i < ipop; i++) {
    feed[i] = 0;
    if (people[i]) pop++;
  }
  for (var j = 0; j < pop; j++){
    var where = Math.random() * 100;
    var who = people[0], i = 0;
    while(who < where) who += people[++i];
    feed[i]++;
  }
  for (var i = 0; i < ipop; i++) {
    if (!people[i]) continue;
    people[i] += feed[i] - 1;
    if (people[i] <= 0) people[i] = 0;
  }
  show();
}

run = function(){
  next();
  if (pop > 1) window.setTimeout(arguments.callee,30);
}

init();

})(document);