PDA

Просмотр полной версии : Помогите написать алгоритм!


Denisator
23.09.2002, 15:24
Чёрт! никак не могу придумать алгоритм!
Есть N переменных (назовём эту группу переменных ААА) значение которых может быть 1 или 0. Из эитих переменных надо выбрать случайным образом одну, значение которой равно 1, затем поменять это значение на 0 и сообщить имя этой переменной переменной name.Если такая переменная найдена то переменной flag присваивается значение 1. Если значение всех переменных ААА равно 0, то ничего не происходит и переменной flag присваевается 0. У-ф-ф-ф!

Спасибо!

Aib
23.09.2002, 15:57
Тебе этот алгоритм для чего нужен-то?
И, вообще говоря, тут вроде и писать нечего - просто в своём предложении замени все "если" на if else и т.д.

Dendroid
23.09.2002, 16:04
То, что ты описал - это и есть алгоритм :)
Если слово в слово переложить это в AS, то получиться:
// возвращает индексы ненулевых значений массива aaa в случайном порядке
var aaa = new Array(1, 0, 1, 0, 0, 0, 1, 0, 0, 1);
var flag;
function selectN() {
var k, n = random(aaa.length);
for (var i = 0; i<aaa.length; i++) {
k = (n+i)%aaa.length;
if (aaa[k]) {
break;
}
}
aaa[k] = 0;
flag = i == aaa.length ? 0 : 1;
return flag ? k : -1;
}
trace(selectN());
trace(selectN());
trace(selectN());
trace(selectN());
trace(selectN());

Конечно это еще можно оптимизировать (если надо).....

Denisator
23.09.2002, 16:19
Тебе этот алгоритм для чего нужен-то? Чтобы из N человечков выбрать одного незанятого, занять его и пустить на него тарелку :-).

Я специально задал вопрос абстрактно чтобы избежать таких формулеровок.

И, вообще говоря, тут вроде и писать нечего - просто в своём предложении замени все "если" на if else и т.д.возникают трудности здесь:"Из эитих переменных надо выбрать случайным образом одну, значение которой равно 1"

Denisator
23.09.2002, 16:40
Тебе этот алгоритм для чего нужен-то? Чтобы из N человечков выбрать одного незанятого, занять его и пустить на него тарелку :-).

Хм... а как понимать эту строчку?
flag = i == aaa.length ? 0 : 1;

Dendroid
23.09.2002, 17:28
Это тернальная операция :)
Только сегодня на лекции студентам рассказывал :)
Это значит: если i равно размеру массива (т.е. единиц не найдено), то переменной flag присвоить 0, иначе присвоить 1...
Ты ж сам просил...

Nox Noctis
23.09.2002, 17:36
Оригинал написал(а) Dendroid
тернальная операциякххх... нет чтобы выражаться по-человечески !... :)

шучу :)
на английском самое правильное название для этой фигни...
безо всяких там жутких слов:
" one-line if " и все

вообще - этьо сильно похоже на маааленькую модель СМО :)
только еще систему отказов\ожидания обработки заявок
сделать и будет оно самое

а самое правильное (но совсем не самое простое ;) ) -
сделать побитовый алгоритм :)
тогда будет уже не массив, а всего одна переменная-число
компактнее и удобнее...
имхо :)

Nox Noctis
23.09.2002, 17:45
кстати о: flag = i == aaa.length ? 0 : 1;

зачем ? :)

то же самое: flag = i != aaa.length;

Dendroid
23.09.2002, 17:53
конечно можно, но так еще менее понятно :)

Denisator
23.09.2002, 21:05
Издеваетесь :( :( :(

Denisator
23.09.2002, 23:28
Большое спасибо Дендроиду, я решил свою задачу не используя этот сложный код, но и не без помощи его. Благодаря этому коду я познал дао кманды break, что и спасло меня. Также я узнал о полезной команде импликации и об тернальной операции.:)

Нокс Ноктису тоже спасибо, но за ответы на мои вопросы в дугих топиках.:)