Форум: "Потрепаться";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизРабросать N на Count чисел Найти похожие ветки
← →
Rentgen © (2005-05-30 12:28) [0]Бодрого времени мастера!
Запарился с задачкой. Может кто поможет:
Нужно число разбить на числа :)
Вообщем на пальцах:
n:=20 //
count:=5;
дальше нужно получить к примеру такие числа:
m1:=4; m2:=6; m3:=3; m4:=3; m5:=4;
т.е. рандомизом "разбросать" наcount
чисел
← →
Alex Konshin © (2005-05-30 12:43) [1]Если m[i] может быть 0, то это равносильно такой задаче:
Имеется n+count-1 ячеек. Выбрать n-1 разных случайных ячеек.
Дальше объяснять? Hint: твои искомые числа будут равны количеству ячеек между избранными.
← →
Sergey13 © (2005-05-30 12:44) [2]А что не получается то?
Рандомайзнуть count-1 чисел. Разница между N и их суммой - последний элемент. Если не хватает уменьшать в цикле все числа, следя за остатком (>0), до выполнения условия.
← →
TUser © (2005-05-30 12:44) [3]if count > 1 then
m[0]:=random(n div count)
else
if count = 1 then
m[0]:=n
else raise ...
sum:=m[0];
for i:=1 to count-2 do begin
m[i]:=random((n-sum) div (n-i));
sum:=sum+m[i];
end;
if count > 1 then
m[n-1]:=n-sum;
← →
KilkennyCat © (2005-05-30 12:47) [4]Поделить число на количество.
В пределах полученного числа запустить рандом, несколько раз (count - 1);
Последнее = вычисляется остаток.
← →
KilkennyCat © (2005-05-30 12:48) [5]мда. торможу :)
← →
Alex Konshin © (2005-05-30 12:48) [6]Отчепятка:
Имеется n+count-1 ячеек. Выбрать count-1 разных случайных ячеек.
← →
TUser © (2005-05-30 12:49) [7]> m[i]:=random((n-sum) div (n-i));
m[i]:=random((n-sum) div (count-i));
← →
Alex Konshin © (2005-05-30 12:51) [8]KilkennyCat © (30.05.05 12:47) [4]
TUser © (30.05.05 12:44) [3]
Обычно подразумевается равномерное распределение. В ваших алгоритмах это не так, по крайней мере мне не очевидно, что оно там равномерное.
← →
Digitman © (2005-05-30 12:55) [9]procedure TForm1.Button1Click(Sender: TObject);
var
i, m, n, count: Integer;
begin
n := StrToInt(Edit1.Text);
i := n;
count := StrToInt(Edit2.Text);
memo1.Lines.Clear;
while Count > 0 do
begin
m := random(i - (count - 1)) + 1;
memo1.Lines.Add(IntToStr(m));
Dec(i, m);
Dec(Count);
end;
end;
сойдет ?)
← →
Alex Konshin © (2005-05-30 12:59) [10]Если числа обязаны быть ненулевыми, то это равносильно такой задаче:
Имеется n ячеек. Выбрать count-1
разную ячейку.
Твои искомые числа - расстояния между выбранными (для крайних - расстояния от концов).
← →
Digitman © (2005-05-30 13:01) [11]пардон
procedure TForm1.Button1Click(Sender: TObject);
var
i, m, n, count: Integer;
begin
n := StrToInt(Edit1.Text);
i := n;
count := StrToInt(Edit2.Text);
memo1.Lines.Clear;
while Count > 0 do
begin
if Count > 1 then
m := random(i - (count - 1)) + 1
else
m := i;
memo1.Lines.Add(IntToStr(m));
Dec(i, m);
Dec(Count);
end;
end;
← →
Alex Konshin © (2005-05-30 13:06) [12]Digitman © (30.05.05 13:01) [11]
У тебя по сути то же самое, что и у них.
← →
Digitman © (2005-05-30 13:09) [13]
> Alex Konshin © (30.05.05 13:06) [12]
алгоритм-то - единый)... выше штанов не прыгнешь)
← →
Alex Konshin © (2005-05-30 13:15) [14]Так я уже сказал, что я сомневаюсь, что он правильный в смысле равновероятности результатов. Кстати, у меня алгоритм-то другой, хотя я и в нем тоже не уверен. Нужно подождать тех, кто еще не забыл комбинаторику. Думкин вроде такие задачи любит.
Хотя, еще вопрос, что требуется по условию. Ждем автора.
← →
Digitman © (2005-05-30 13:21) [15]
> Alex Konshin © (30.05.05 13:15) [14]
> Ждем автора
автору, думается, начхать на "равновероятность" и "комбинаторику")
"на пальцах" он объяснил, "на пальцах" и решение ожидает)
а если не "на пальцах", то и вопроса бы не задал, ибо постановка задачи есть 90% ее решения)
← →
KilkennyCat © (2005-05-30 13:29) [16]ну, ежели равномерное хочется, то достаточно просто поделить исходнае число на количество, округлить до целого, дробный остаток прибавлять к следующему элементу, пока не доберет до целого.
← →
Alex Konshin © (2005-05-30 13:32) [17]А потом он будет искать причину, почему в его игрушке AI почти всегда делает так, и почти никогда - вот эдак.
Лучше уж его заранее предупредить. Вот на это я и обращаю внимание.
← →
KilkennyCat © (2005-05-30 13:35) [18]эт верно.
Я бы посмотрел функцию какого-нибудь генератора случайных чисел, и адаптировал ее под требуемое.
← →
Digitman © (2005-05-30 13:38) [19]
> Alex Konshin © (30.05.05 13:32) [17]
да какая уж тут игрушка ?
тут ликбезом пахнет, а не игрушкой)
алгоритм-то - элементарный, не взирая на всякие там "комбинаторики", и не реализовать его самостоятельно просто стыдно
← →
Rentgen © (2005-05-30 13:38) [20]> Digitman ©
На "пальцах" я объяснил для того, чтобы
смогли помочь не только кодом, но и алгоритмом
> Alex Konshin ©
По условию вполне подходит:
> Digitman © (30.05.05 13:01) [11]
Всем спасибо.
← →
Alex Konshin © (2005-05-30 13:38) [21]KilkennyCat © (30.05.05 13:29) [16]
Не понял.
Во всех ваших алгоритмах недостаток в том, что выборка следующего зависит от предыдущего. Меня это сразу настораживает. Доказывать лень, но по-моему очевидно, что в вашем случае будут перекосы в вероятностях.
← →
KilkennyCat © (2005-05-30 13:42) [22]
> [21] Alex Konshin © (30.05.05 13:38)
я ошибся. Просто подумал о графике функции и разбросу по нему чисел. Показалось, что это можно провернуть и с рэндом-функцией.
А перекосы в любом случае будут.
← →
Alex Konshin © (2005-05-30 13:47) [23]Не скажи. На мой взгляд, правильная его реализация не совсем очевидна. Как я уже сказал, ваши алгоритмы нельзя применять в большинстве случаев, где есть тебования к вероятностям (а в реальных ситуациях они есть). Даже если это ликбез, то не стоит учится на таких ошибках. Ведь нашим ответам доверяют. По крайней мере нужно предупредить о возможных побочных эффектах.
Кстати, мой не намного сложнее, оставлю его реализацию на домашнее задание.
← →
Digitman © (2005-05-30 13:48) [24]
> Rentgen © (30.05.05 13:38) [20]
> > Digitman ©
>
> На "пальцах" я объяснил для того, чтобы
> смогли помочь не только кодом, но и алгоритмом
а что, помощь в алгоритме и коде была бы заметно скудней, если бы ты поставил задачу хотя бы вот так :
Имеются два значения m и count, где m и count - натуральные числа, такие что m >= count
Необходимо случайным образом получить множество, состоящее из count неуникальных натуральных чисел, таких что их сумма была бы равна m
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.052 c