Недавно написал маленькую, но полезную прогу, называется "Игральные кубики". Смысл программы, в следующем: вы выбираете кол-во кубиков от 1 по 20. И бросаете кубики.
Данная версия основана на рандоме, но усчетом факторов реального броска кубиков.
Данную прогу остается улучшить применив еще эврестический подход, для наиболее точно имитации броска игральных кубиков.
Скачать можно на этой странице: http://lasoftgame.ru/downloads.php?cat_id=5
З.Ы.
Знаю, что вы можете сказать: "Нечего страдать фигней" и т.д. Но лучше использовать электронную версию кубиков, чем постоянно искать реальные.
Неактивен
Нажимаем на любом калькуляторе RND и умножаем на разность верхней и нижней границы (например, на 114, если у нас 20 кубиков), округляем - вот и наши кости...
Неактивен
fireton написал:
3 кубика никак не смогут выдать число меньше 3, например.
Совершенно верно. Именно так и получится по моей формуле. Ну, конечно, надо прибавить нижнюю границу, но это и без того ясно.
0 ≤ RND ≤ 1
Верхняя граница (с 3 кубиками) = 3 * 6 = 18
Нижняя граница = 3 * 1 = 3
3 ≤ RND * (18 - 3) + 3 ≤ 18
Вероятности выпадения для каждого кол-ва очков одинаковы.
Что не так?
Неактивен
Да, точно, проглядел. ![]()
Ну тогда можно просто бросать кубики по дискретному равномерному распределению.
Неактивен
Korwin написал:
Если для программы, имитирующей броски кубиков, мы качаем 20 мб библиотеку!
Не все так плохо, KRI будет занимать ненамного больше 100 КБайт, ничего не требуя. ![]()
Разве что GDI+, но в XP и выше он есть по умолчанию, а ниже можно установить (пакет весит ~900 КБайт).
Korwin написал:
Кто алгоритмом поделится?
А чего там делиться? Числа небольшие, решаем в лоб. Псевдокод:
score = 0; for (i = 0; i < n; i++) // n - число бросков кубика (ну или число кубиков) score += 1 + 5 * random(); // Где random - функция, возвращающая случайное число от 0 до 1
Неактивен
Eten написал:
Hind, а где ты увидешь на кубиках дубль, если у тебя только одна цифра будет?
Блин, значит будем очки на каждом кубике в массив пихать, один шут. В ТЗ ничего не было о необходимости выводить очки по каждому кубику. Вообще, короче - ТЗ не было.
И еще, Eten, откройте для себя Alt + Print Screen.
Что касается вашего алгоритма, то это вообще смешно - никакой разницы вот с этим нет, вы просто делаете лишние вычисления:
int score = 0;
int * dice = new int[n];
for (int i = 0; i < n; i++)
{
dice[i] = 1 + 5 * random();
score += dice[i];
}
...
delete [] dice;Для реального кубика - дискретное равномерное распределение. Не углубляясь в "случайность" сишного рандома, скажу, что для вышенаписанного кода распределение именно таково. У вашего - не знаю, это проще увидеть на графике.
Неактивен
Я же писал:
Где random - функция, возвращающая случайное число от 0 до 1
Имелось в виду, принадлежащее отрезку [0, 1].
Разумеется, если вы хотите использовать сишную функцию, нужно курить ее описание.
Eten, у вас очень большая проблема - вы считаете "заумные слова" ничего не значащими, а между тем это часть терминологии теории вероятностей, имеющая точные и четкие определения и совершенно обоснованно здесь мной используемая.
Неактивен
Eten написал:
Когда выложишь нормальный код, тогда и приму твои заверения.
Да... Тут явно не о чем говорить - уровни подготовки несопоставимы.
Неактивен
fireton написал:
Но если задачей ставится именно достоверная имитация броска набора кубиков, то обычным рандомом не обойдешься.
Но ведь достоверная имитация броска кубиков - задача, мягко говоря, другого порядка сложности при отсутствии готового физического движка. Никто с этим и не спорит, просто то, что предложил Eten, для игрока ничем не отличается от моего варианта (специально частотные диаграммы построил), а работает не столь эффективно.
Неактивен
Eten написал:
А где ты их выложил? Уж очень интересно посмотреть
А нафига? Они ничего не докажут сами по себе - всегда можно сказать, что я их нарисовал от фонаря. Кому нужно - тот сам построит, да не забудьте взять число бросков побольше - хотя бы миллион.
Вот реализация моего алгоритма на C:
#include <stdio.h>
#include <stdlib.h>
int main()
{
srand((unsigned)time(0));
int n = 1000000;
int num = 0;
int dice[6] = {0,0,0,0,0,0};
for (int i = 0; i < n; i++)
{
num = rand() % 6;
dice[num]++;
}
printf ("%d\n%d\n%d\n%d\n%d\n%d", dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]);
}Программа выдает список количества выпаданий для каждой стороны кубика.
Если так интересно, график тут.
Можешь сравнить со своим - отличий за пределами погрешности не будет.
Ну, наверное, уже все понятно, да?
Отредактировано Hind (29.03.2008 20:53)
Неактивен