月曜からカタコリ

ハッカーにも画家にもなれない

JavaScriptで重み付けランダム並び替え

昨日、5人の順番を決めなくてはならない、と言う場面がありまして、
ただランダムで決めるのも芸がないと思ったので、重み付けをしてからランダムで並び替えをする、というコードを書いてみました。

var members = {A:100, B:100, C:100, D:100, E:100};
function getRandomOrder(members) {
	var index = 1;
	var order = {};

	var addWeights = function(members) {
		var totalWeight = 0;
		var membersAddingWeight = {};
		for (var k in members) {
			totalWeight += members[k];
			membersAddingWeight[k] = totalWeight;
		}
		return membersAddingWeight;
	};

	for (var i in members) {
		var membersAddingWeight = addWeights(members);
		var point = membersAddingWeight['E'] * Math.random();
		for (var k in membersAddingWeight) {
			if(point < membersAddingWeight[k]) {
				order[index] = k;
				index += 1;
				members[k] = 0;
				break;
			}
		}
	}
	return order;
}
console.log(getRandomOrder(members));


メンバーに「好きな重みをおっしゃってください」と聞いたところ、
「1億!」「10」「100でいいです」「25ぐらい…(私)」という回答が帰って来ました。

御察しの通り、「1億」という数字が入ると10と25と100の重みの違いがほぼ無いようなものになってしまいます。
まあでも最初に1億の人が選ばれる確率が高いから大丈夫なのか…?

もっといいロジックがあれば教えていただきたいです。



命名が幼稚園児レベルで恥ずかしい…