Равновероятное распределение.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dominator
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 20
Зарегистрирован: 12.10.2007 (Пт) 21:38
Откуда: Казань

Равновероятное распределение.

Сообщение Dominator » 13.10.2007 (Сб) 21:27

Если есть такая тема прошу пр.
Есть такая проблема. Как получить от некоего числа по n-количеству равновероятных распределений. Т.е.
Есть число 30. Нужно распределить числа в случайном порядке, чтоб никого не обидеть.
Изображение

Arcady_XQST
Обычный пользователь
Обычный пользователь
 
Сообщения: 85
Зарегистрирован: 17.09.2007 (Пн) 1:27
Откуда: Russia, Bryansk

Сообщение Arcady_XQST » 13.10.2007 (Сб) 21:40

Т.е. распределить все составляющие числа 30 в случайном порядке (0,24,15...)?
// тили-тили, трали-вали
if (jsLoaded) {
// это дело мне по силе, откажусь теперь едва ли
} else {
// это мы не проходили, это нам не задавали
}

Dominator
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 20
Зарегистрирован: 12.10.2007 (Пт) 21:38
Откуда: Казань

Сообщение Dominator » 13.10.2007 (Сб) 22:06

Т.е. распределить все составляющие числа 30 в случайном порядке (0,24,15...)?

Не так. Есть число 30 или (m) и есть 6 переменных или (n) переменных.
Надо чтобы выполнялась система:
1. сумма (n) переменных = числу (m)
2. приоритет каждой переменной был равен.(т.е. вероятность выпадения (m) у первой переменной =вероятность выпадения (m) у последней переменной.)
Например для m=30, n=6:
(25,3,1,1,0,0) приблизительно неправильно
(3,4,6,5,2,4,6) приблизительно правильно
Последний раз редактировалось Dominator 14.10.2007 (Вс) 14:07, всего редактировалось 1 раз.
Изображение

udpn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 24.07.2007 (Вт) 11:43

Сообщение udpn » 13.10.2007 (Сб) 22:42

лучше дай задачу в исходном виде, похоже на бред
Не ищите смысла там, где его не ложили (c) проф. В.В. Горяйнов

Dominator
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 20
Зарегистрирован: 12.10.2007 (Пт) 21:38
Откуда: Казань

Сообщение Dominator » 13.10.2007 (Сб) 23:11

Ну как хочешь.
В Ролевых играх обычно при выборе персонажа дают прокачать его начальные навыки(на это дается опр.кол-во очков).
В данном случае 30 очков. Нужно чтобы комп распределил случайным образом эти 30 очков на 6 навыков игрока равномерно.
Изображение

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 14.10.2007 (Вс) 0:11

А разделить 30 на 6 и к каждому навыку прибавить не судьба? :)
Подпись проходит рефакторинг

Dominator
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 20
Зарегистрирован: 12.10.2007 (Пт) 21:38
Откуда: Казань

Сообщение Dominator » 14.10.2007 (Вс) 9:42

Lumen Надо чтобы сумма была 30.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.10.2007 (Вс) 10:00

Сумма чего? Приведи пример того, что дано, и что надо сделать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dominator
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 20
Зарегистрирован: 12.10.2007 (Пт) 21:38
Откуда: Казань

Сообщение Dominator » 14.10.2007 (Вс) 14:06

Хакер писал(а):Сумма чего? Приведи пример того, что дано, и что надо сделать.

Сумма распределенных очков.
Изображение

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 14.10.2007 (Вс) 14:25

Dominator
Че-та непонятно как-то. Что за распределенные очки?
Хакер писал(а):Приведи пример того, что дано, и что надо сделать.
Подпись проходит рефакторинг

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 14.10.2007 (Вс) 14:46

Делим m на n, получаем число x.
Создаём массив, размерностью n.
Заполняем его числом x.
По очереди берём ячейки массива.
Берём случайное число z в диапазоне от 0 до x/2
Берём случайное число от 1 до 2, если выпадет 1, переносим число z из очередной ячейки в случайную, если 2 переносим число z из случайной ячейки в очередную.

Это только теория, с этими случайными числами такое может быть...

Добавлено:
Это если число x - целое...
Последний раз редактировалось Crio 14.10.2007 (Вс) 17:25, всего редактировалось 1 раз.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 14.10.2007 (Вс) 15:02

Не так. Есть число 30 или (m) и есть 6 переменных или (n) переменных.
Надо чтобы выполнялась система:
1. сумма (n) переменных = числу (m)
2. приоритет каждой переменной был равен.(т.е. вероятность выпадения (m) у первой переменной =вероятность выпадения (m) у последней переменной.)
Например для m=30, n=6:
(25,3,1,1,0,0) приблизительно неправильно
(3,4,6,5,2,4,6) приблизительно правильно

Почему в "приблизительно неправильном" варианте - 6 чисел, а в "приблизительно правильном" - 7 чисел?

Итак:
1. есть 30 очков.
2. есть 6 навыков игрока.
Нужно разделить очки равномерно на все навыки?

Тогда нажно количество очков разделить на кол-во качеств: 30/6 = 5?
Сумма 6 переменных со значением 5 = 30. Вероятность выпадения 5 равна вероятности выпадения 5. В чем проблема?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Dominator
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 20
Зарегистрирован: 12.10.2007 (Пт) 21:38
Откуда: Казань

Сообщение Dominator » 14.10.2007 (Вс) 16:52

Почему в "приблизительно неправильном" варианте - 6 чисел, а в "приблизительно правильном" - 7 чисел?

Извиняюсь исправил.
Сумма 6 переменных со значением 5 = 30. Вероятность выпадения 5 равна вероятности выпадения 5. В чем проблема?

Да, да зачем тогда компьютер. Давайте тода программировать на калькуляторе?!
Изображение

Arcady_XQST
Обычный пользователь
Обычный пользователь
 
Сообщения: 85
Зарегистрирован: 17.09.2007 (Пн) 1:27
Откуда: Russia, Bryansk

Сообщение Arcady_XQST » 14.10.2007 (Вс) 20:10

Dominator писал(а):Да, да зачем тогда компьютер. Давайте тода программировать на калькуляторе?!
Телепат тут один :) , но мне кажется и он не понимает, что ты имеешь ввиду. Тебе нужен код на VB деления числа 30 на 5 ? :lol:
// тили-тили, трали-вали
if (jsLoaded) {
// это дело мне по силе, откажусь теперь едва ли
} else {
// это мы не проходили, это нам не задавали
}

Dominator
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 20
Зарегистрирован: 12.10.2007 (Пт) 21:38
Откуда: Казань

Сообщение Dominator » 14.10.2007 (Вс) 20:14

Никто меня не понимает :cry:
Изображение

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 14.10.2007 (Вс) 20:32

На сколько я понял, требуется разложить число 30 на шесть чисел, но так, чтобы они не были равны друг другу и не сильно различались по величине.

Arcady_XQST
Обычный пользователь
Обычный пользователь
 
Сообщения: 85
Зарегистрирован: 17.09.2007 (Пн) 1:27
Откуда: Russia, Bryansk

Сообщение Arcady_XQST » 14.10.2007 (Вс) 20:42

Dominator писал(а):Никто меня не понимает :cry:
Так ты объясни, а то уже n-ое количество догадок предложили - и никто не угадал... Даже телепаты :)

Моя версия: из числа 30 надо получить 6 разных чисел, которые в сумме составляли-бы 30. Угадал?
// тили-тили, трали-вали
if (jsLoaded) {
// это дело мне по силе, откажусь теперь едва ли
} else {
// это мы не проходили, это нам не задавали
}

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.10.2007 (Вс) 20:42

Я правильно понимаю

Ты хочешь делать 17 на 7 но вариант [2,4285714285714285714285714285714] тебя не устраивает, и тебе нужно что-то вроде:
3 2 2 3 2 2 3

Если правильно, то тебе надо копать в сторону алгоритма Брезенхема.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 14.10.2007 (Вс) 20:52

Ой! А прямую ссылку на это можно!?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.10.2007 (Вс) 20:57

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 14.10.2007 (Вс) 21:17

Спасибо!

(пора бы Яндексу начать искать в Вики... Мне тоже...)

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 14.10.2007 (Вс) 22:55

Crio
пора тебе разглядеть в вики строку поиска!
Dominator
а если for next от 1 до 30 с +1 на случайную переменную? так тебя не устроит?

Код: Выделить всё
dim a(6) as Integer
dim i as Integer, r as Integer

randomize
for i = 1 to 30
r = int(rnd*5)+1
a(r)=a(r)+1
next
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

udpn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 24.07.2007 (Вт) 11:43

Сообщение udpn » 15.10.2007 (Пн) 13:25

Код: Выделить всё
m = 30/6
For i = 0 to n
    a(i)=m
Next
' Теперь надо зарандомить
For i = 1 to 1000
    x = Int(Rnd * n) Mod n
    a(x) = a(x) + 1
    x = Int(Rnd * n) Mod n
    a(x) = a(x) - 1
Next
Не ищите смысла там, где его не ложили (c) проф. В.В. Горяйнов

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.10.2007 (Пн) 13:39

Все эти самоделки нерациональны. А код с тысячекратным сложением/вычитанием так и вовсе глуп.
Правильное направление (алгоритм Брезенхема) уже было дано, надо лишь подправить его под свои нужды.
Lasciate ogni speranza, voi ch'entrate.

udpn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 24.07.2007 (Вт) 11:43

Сообщение udpn » 15.10.2007 (Пн) 15:34

алгоритм Брезенхэма - метод прорисовки линий. здесь задача мягко говоря несвязуемая. объясни. если тебе что-то напомнила последовательность 3 2 2 3 2 2 3 (а именно зубчатость), то это туту ни при чем.

Математически изъясняюсь, необходимо найти одно произвольное решение системы

x_1 + x_2 + ... + x_n = s
0 <= x_i <= s

причем из-за первого условия оно нифига не равновероятное

с циклом я действительно переборщил, но другие варианты на ум нейдут
Не ищите смысла там, где его не ложили (c) проф. В.В. Горяйнов

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 15.10.2007 (Пн) 15:42

... но именно наши самоделки пойдут в код, а не ваши понты с Брезенхемом. :lol:
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.10.2007 (Пн) 15:50

udpn
Нет, алгоритм Брезенхэма, это гораздо более широко-применимый алгоримт, чем ты думаешь. Это алгоритм деления с коррекцией отклонения через равные заданные промежутки. Здесь нужен именно он.

Кстати говоря, оказывается, его уже предлагали здесь использовать для этих целей: http://bbs.vbstreets.ru/viewtopic.php?t=25833
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 15.10.2007 (Пн) 19:05

... но именно наши самоделки пойдут в код, а не ваши понты с Брезенхемом.

...и это печально...

Dominator
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 20
Зарегистрирован: 12.10.2007 (Пт) 21:38
Откуда: Казань

Сообщение Dominator » 15.10.2007 (Пн) 19:57

Кстати говоря, оказывается, его уже предлагали здесь использовать для этих целей:

Хакер спосибо.
Брезенхэм рулит! :lol: :) :D
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 97

    TopList