29.05.2010, 15:44
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
|
|
29.05.2010, 15:51
|
Профессор
|
|
Регистрация: 21.01.2010
Сообщений: 1,022
|
|
рони, спасибо за помощь. То, что нужно.
|
|
19.12.2015, 15:50
|
|
Интересующийся
|
|
Регистрация: 29.10.2014
Сообщений: 25
|
|
Здравствуйте. При использовании данной функции,взятой из этой темы(спасибо рони), очень часто выскакивает значение "undefined". Не могу понять, где я накосячил переделывая написанное рони в функцию.
function addArray(letterOfArray, arrayOfCorrelation) {
function usefloor(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
var m = [],
s = [],
t = [];
var l = 9; //длина массива
var min = 1;
var max = 9;
//создание массива m с неуникальными элементами
for (var i = 0; i < l; i++) {
m[i] = usefloor(min, max)
}
var test = m;
//создание массива t из оставшихся элементов на случай замены
for (var i = 0; i <= (max - min); i++) {
s[i] = 1;
}
for (var i = 0; i < l; i++) {
s[m[i]] = 0;
}
for (var i = 0; i < s.length; i++) {
if (s[i] == 1) t.push(i)
}
test = t;
//проверка m на уникальность и замена повторяющихся элементов
for (var i = 0; i < l; i++) {
for (var k = i + 1; k < l; k++) {
if (m[k] == m[i] || m[k]=="undefined") {
n = usefloor(1, (t.length - 1));
m[k] = t[n];
t.splice(n, 1);
}
}
}
for (var i = 0; i < l; i++) {
var count = i + 1;
document.getElementById(letterOfArray + count).value = m[i];
}
var arrayOfCorrelation =this.arrayOfCorrelation= m;
return arrayOfCorrelation;
}
var arrayA;
addArray("a", arrayA);
addArray("b", arrayA);
addArray("c", arrayA);
addArray("d", arrayA);
addArray("e", arrayA);
addArray("f", arrayA);
addArray("g", arrayA);
addArray("h", arrayA);
addArray("i", arrayA);
document.write(arrayA);
|
|
19.12.2015, 16:51
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Stroy,
Вы лучше описали бы, что Вы хотите получить в итоге?
Случайно перемешанный массив ?
function Peremeshivalka(lng){
var a = {},i,out=[],n=0;
for(i=0;i<lng;i++)a[i]=i;
while (n!=lng){
i = Math.floor(lng*Math.random());
if(typeof(a[i])!='undefined'){
out.push(a[i]);
delete a[i];
n++;
}
}
return out;
}
var arr = "abcdefghi".split(''); //Массив перемешивания;
var lng = arr.length;
var index = Peremeshivalka(lng);
var out = [];
for(var i=0;i<lng;i++)out.push(arr[index[i]]);
alert(out)
Последний раз редактировалось Deff, 19.12.2015 в 23:02.
|
|
19.12.2015, 21:30
|
|
Интересующийся
|
|
Регистрация: 29.10.2014
Сообщений: 25
|
|
Deff,
Есть 2-х мерный массив 9Х9. Хочу построчно заполнить его случайными числами в диапазоне 1-9. Каждая ячейка имеет свой id. Буква(a-i)+цифра от1-9.
С функцией взятой из этой темы вроде все получается. Но частенько во второй половине массива по горизонтали вместо числа, выдается значение undefied.
|
|
19.12.2015, 21:50
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Stroy,
так взяли бы код из 9 поста и запустили девять раз , а не проверочный из 10 или вам нужно чтоб кроме строк и столбцы были разными?судоку ?
|
|
19.12.2015, 22:36
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Stroy
|
Есть 2-х мерный массив 9Х9. Хочу построчно заполнить его случайными числами в диапазоне 1-9. Каждая ячейка имеет свой id.
|
Запустите функцию function Peremeshivalka(9) - 9 раз(можно в цикле)
При каждом запуске получите массив случайный из 9 элементов
function Peremeshivalka(lng){
var a = {},i,out=[],n=0;
for(i=0;i<lng;i++)a[i]=i;
while (n!=lng){
i = Math.floor(lng*Math.random());
if(typeof(a[i])!='undefined'){
out.push(a[i]+1); //Добавил 1(чтобы не от 0)
delete a[i];
n++;
}
}
return out;
}
var out =[];
for(var i=0;i<9;i++){ out.push(Peremeshivalka(9).join(','));}
alert(out.join(',\n'))
//
==========================
Хотя пост 9 делает тож самое не хуже
// Замерил на 10000 элементах - мой быстрее
(наверно splice(n,1)[0]; дольше, чем delete a[i];
Последний раз редактировалось Deff, 19.12.2015 в 22:50.
|
|
20.12.2015, 12:17
|
|
Интересующийся
|
|
Регистрация: 29.10.2014
Сообщений: 25
|
|
Сообщение от рони
|
Stroy,
так взяли бы код из 9 поста и запустили девять раз , а не проверочный из 10 или вам нужно чтоб кроме строк и столбцы были разными?судоку ?
|
Да,судоку. Сначала идет заполнение построчно, потом будет проверка по столбцам и по матрицам 3х3.
|
|
20.12.2015, 12:20
|
|
Интересующийся
|
|
Регистрация: 29.10.2014
Сообщений: 25
|
|
Deff,
Спасибо. Попробую прикрутить Вашу функцию. Или ф-цию рони из поста 9.
|
|
20.12.2015, 13:27
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
судоку sudoku
Stroy,
Судоку, простая генерация в лоб ... если вы видите число 300000 значит вам не повезло.
<!DOCTYPE HTML>
<html>
<head>
<title>sudoku</title>
<meta charset="utf-8">
</head>
<body>
<script>
Array.prototype.shuffle = function() {
for (var a = this.length - 1; 0 < a; a--) {
var b = Math.floor(Math.random() * (a + 1)),
c = this[b];
this[b] = this[a];
this[a] = c
}
return this
};
for (var arr = [], b = [], obj = {}, column = {}, d = 0, i = 0; 9 > i; i++)
b.push(i + 1), obj[i] = {}, column[i] = {};
for (var k = 0; 9 > k;) {
b = b.slice().shuffle();
var a = b.every(function(c, e, f) {
f = (e / 3 | 0) + 3 * (k / 3 | 0);
return !obj[f][c] && !column[e][c]
});
d++;
if (300000 <= d) break;
a && (arr.push(b), b.forEach(function(c, e, f) {
obj[(e / 3 | 0) + 3 * (k / 3 | 0)][c] = column[e][c] = !0
}), k++)
};
document.write(arr.join('<br>')+ '<br>'+d)
</script>
</body>
</html>
Последний раз редактировалось рони, 20.12.2015 в 13:43.
|
|
|
|