Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.055 c
14-1112092631
Kevin Brown
2005-03-29 14:37
2005.06.29
Анимированные Gif ы.


5-1088249593
Виталя
2004-06-26 15:33
2005.06.29
Событие OnExit для наследника TEdit


14-1115242958
i-s-v
2005-05-05 01:42
2005.06.29
SMS


1-1117875729
Masta Hookah
2005-06-04 13:02
2005.06.29
COPY FILE


1-1118216795
llirik
2005-06-08 11:46
2005.06.29
Ассоциативный массив





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский