Сообщение от 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)
А вот для второго кода из топика вполне очевидно, что он может дать равномерное распределение только для массива из двух элементов.
Для большего количества - распределение будет неравномерным, и при этом будет зависеть от браузера(от реализации сортировки в нем), потому что сравниваться будет далеко не все элементы со всеми, и в случае с быстрой сортировкой количество перестановок будет стремится к минимально возможному