Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Рабросать 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.038 c
1-1118051551
SergeiX
2005-06-06 13:52
2005.06.29
как убрать разбиение на страницы


9-1111865916
Bret
2005-03-26 22:38
2005.06.29
Выстрел в GLscene


1-1118130236
makle
2005-06-07 11:43
2005.06.29
TreeView. Количество вложенных уровней у нода


14-1117551152
Ломброзо
2005-05-31 18:52
2005.06.29
Что посоветуете почитать по методикам тестирования


1-1117903664
Destroyer
2005-06-04 20:47
2005.06.29
Как динамически создавать кнопки с событиями для ActionToolBar?