Показать сообщение отдельно
  #7 (permalink)  
Старый 24.04.2012, 01:32
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от B~Vladi
Мсье знает толк в извращениях?
А мне ваше решение кажется извращением, ведь на выходе получается далеко не случайный массив

А вот и код для тестирования результата на случайность, и заодно мой вариант функции сортировки

var test_count = 100000;
var test_result;
var array = [1, 2, 3];

test(resort1);
console.log('=========');
test(resort2);
console.log('=========');
test(resort3);

function test(func) {
	test_result = {};
	for(var i = 0; i < test_count; i++) {
		var arr = array.slice();
		func(arr);
		if(test_result[arr] == undefined) {
			test_result[arr] = 0;
		}
		test_result[arr]++;
	}
	var test_list = [];
	for(var i in test_result) {
		test_list.push([i,test_result[i]]);
	}
	min = max = test_result[i];
	test_list.sort(function(a,b) {
		min = Math.min(min, a[1], b[1]);
		max = Math.max(max, a[1], b[1]);
		return a[0] < b[0] ? -1 : 1;
	});
	for(var i =0; i< test_list.length; i++) {
		console.log(test_list[i][0] + ': ' + test_list[i][1]);
	}
	console.log([min, max]);
}

function resort1(arr1) {
    var did = []
    sort1()
    function sort1() {
		var i = 0;
		do {
			var r1 = Math.random() * arr1.length | 0
			var r2 = Math.random() * arr1.length | 0
			var m1 = arr1[r1]
			var m2 = arr1[r2]
			arr1[r1] = m2
			arr1[r2] = m1
			did.push(r1)
			did.push(r2)
			i += 2
		} while (i != 6)
	}
}
function resort2(arr1) {
	arr1.sort(function () {
	  return Math.round(Math.random()) * 0.5;
	});
}
function resort3(arr) {
	var new_arr = [0,0];
	for(var i = 0, s = arr.length; i < s; i++) {
		new_arr.push(arr.splice(Math.floor(Math.random()*(s-i)), 1)[0]);
	}
	arr.splice.apply(arr, new_arr)
}

И примеры полученных результатов(для краткости только min/max)
Цитата:
[14707, 18513]
[12399, 25029]
[16548, 16731]
наиболее равномерное распределение у моего варианта.
И к тому же достаточно очевидно, что распределение будет статистически равномерным(при условии статистической равномерности Math.Random)

А вот для второго кода из топика вполне очевидно, что он может дать равномерное распределение только для массива из двух элементов.
Для большего количества - распределение будет неравномерным, и при этом будет зависеть от браузера(от реализации сортировки в нем), потому что сравниваться будет далеко не все элементы со всеми, и в случае с быстрой сортировкой количество перестановок будет стремится к минимально возможному
Ответить с цитированием