Форум программистов, компьютерный форум CyberForum.ru

Имитация игры с костями, вероятность шести - наибольшая - C++

Войти
Регистрация
Восстановить пароль
 
 
Serg_yer
0 / 0 / 0
Регистрация: 14.07.2014
Сообщений: 4
20.07.2014, 16:06     Имитация игры с костями, вероятность шести - наибольшая #1
нужно создать функциу которая генерирует число от 1 до 6, вероятность что выпадет 6 20% а число 1-5 16%
подскажите пожалуйста
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6414 / 4880 / 448
Регистрация: 14.02.2011
Сообщений: 16,182
21.07.2014, 13:48     Имитация игры с костями, вероятность шести - наибольшая #21
Цитата Сообщение от Supernatural Посмотреть сообщение
скромный вопрос, а где я написал код а=rand()%2?
А это кто писал?
Цитата Сообщение от Supernatural Посмотреть сообщение
да, проверил вывод при rand()%1 и при rand()%2, в первом случае кроме 0 я ничего не получил, во втором случае появлялись 1
Цитата Сообщение от Supernatural Посмотреть сообщение
Что касается 6, то там отдельная "вероятность".
в твоем решении она вообще не выпадает
Цитата Сообщение от Supernatural Посмотреть сообщение
и да, не совсем понимаю использование rand_max )))
для правильного распределения % не подходит
для статистики используется формула
случайное число разделить на максимум тогда мы получаем число в диапазоне от 0 до 1(дробное)
умножаем на нужный нам диапазон округляем и получаем число в нужном нам диапазоне

вот код
C++
1
2
double tmp=(double)rand()/RAND_MAX;// число от 0 до 1
int m=tmp*n;
чтобы не связываться с плавающими я изменил порядок вычисления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,452
21.07.2014, 13:53     Имитация игры с костями, вероятность шести - наибольшая #22
Цитата Сообщение от ValeryS Посмотреть сообщение
А это кто писал?
это я перепроверял себя, не пишу ли я чепуху.
Цитата Сообщение от ValeryS Посмотреть сообщение
в твоем решении она вообще не выпадает
в каком решении?
ValeryS
Модератор
6414 / 4880 / 448
Регистрация: 14.02.2011
Сообщений: 16,182
21.07.2014, 14:06     Имитация игры с костями, вероятность шести - наибольшая #23
Цитата Сообщение от Supernatural Посмотреть сообщение
в каком решении?
это что?
Цитата Сообщение от Supernatural Посмотреть сообщение
C++
1
2
3
4
srand(time(0));
a=rand()%6;
if (a==0) a++; //если а=0, то прибавляем 1
cout<<a;
вот статья насчет ранда
в комментарии сказано насчет распределения и чем плох %
http://younglinux.info/c/rand
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 14:09     Имитация игры с костями, вероятность шести - наибольшая #24
Вот, довел функцию до идеала. Максимальная производительность, минимум операций. Кто сможет лучше?

C
1
2
3
4
5
6
7
8
int con_dice(void)
{
    int d = rand();
    if( d < RAND_MAX / 5 ) {
        return 6;
    }
    return d / ((RAND_MAX + 1) / 5) + 1;
}
ValeryS
Модератор
6414 / 4880 / 448
Регистрация: 14.02.2011
Сообщений: 16,182
21.07.2014, 14:17     Имитация игры с костями, вероятность шести - наибольшая #25
Цитата Сообщение от Vtulhu Посмотреть сообщение
Максимальная производительность, минимум операций. Кто сможет лучше?
я могу
показал уже, табличный метод никаких ветвлений
для еще большей крутизны можно перемешать массив
Цитата Сообщение от Vtulhu Посмотреть сообщение
Я только не понял, почему ValeryS считает, что делить числовую прямую на отрезки лучше.
есть веши которые я изучал очень давно, и чтобы привести доказательства мне нужно поднять литературу
но посмотри комментарий по ссылке

когда найду более строгое доказательство, приведу конечно
Цитата Сообщение от Vtulhu Посмотреть сообщение
как я до этого не видел ни у кого и никогда:
Это очень старое решение в последнее время не практикуется
Сам грешен, пользуюсь Лень формулы писать
Supernatural
285 / 141 / 28
Регистрация: 22.11.2010
Сообщений: 1,452
21.07.2014, 14:34     Имитация игры с костями, вероятность шести - наибольшая #26
ValeryS, я предложил лишь вариант)
мне интересно, где в коде расчет тех самых 20 %(6) и 16%(1-5) вероятности появления цифр, просветите неуча
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 14:45     Имитация игры с костями, вероятность шести - наибольшая #27
Посмотрел по ссылке и пожалел, что дал переубедить себя. Изначально мой код, конечно, выглядел вот так:

C
1
2
3
4
5
6
7
8
int con_dice(void)
{
    int d = rand();
    if( d < RAND_MAX / 5 ) {
        return 6;
    }
    return d % 5 + 1;
}
Любому дураку ясно, что функция rand подходит, только если количество чисел, которые нам нужно генерировать, хотя бы на один порядок меньше, чем RAND_MAX. Точнее, (RAND_MAX + 1), но когда речь идет о порядках, единица уже не играет роли. Если нам нужно больше чисел, нужно искать альтернативные пути. Нагуглить альтернативную реализацию rand. Подключить библиотечную функцию с каким-нибудь вихрем Мерсенна. В конце-концов, воспользоваться GenCryptRandom, если не пугает анальное рабствовендор-локинг. У меня есть собственный метод, основанный на хэшировании внешних данных алгоритмом Murmur2A.
ValeryS
Модератор
6414 / 4880 / 448
Регистрация: 14.02.2011
Сообщений: 16,182
21.07.2014, 15:25     Имитация игры с костями, вероятность шести - наибольшая #28
Цитата Сообщение от Supernatural Посмотреть сообщение
мне интересно, где в коде расчет тех самых 20 %(6) и 16%(1-5)
ты про мой код имеешь ввиду?
тогда объяснюсь
изначально из 100% чисел мы можем выбрать 16 единиц двоек троек четверок и пятерок и 20 шестерок
можно забабахать массив на 100 элементов и записать туда 16 единиц двоек троек четверок и пятерок и 20 шестерок
но поскольку и 100 и 16 и 20 делится на 4 то я сократил массив
получилось всех по 4 и шестерок 5
размер массива стал 25
далее случайно выбираем число в диапазоне 0 -24 и выводим на экран число которое записано в массиве
выборка из массива очень быстрая операция в отличии от ветвления


Vtulhu, генератор случайной последовательности есть слабое место в любом программном продукте
ибо машна не знает что есть случайность
посему и придумано куча алгоритмов и какой куда ставить решает программист

Добавлено через 1 минуту
Цитата Сообщение от Vtulhu Посмотреть сообщение
Любому дураку ясно, что функция rand подходит, только если количество чисел, которые нам нужно генерировать, хотя бы на один порядок меньше,
и желательно чтобы диапазон был кратен степени двойки тогда % даст нормальное распределение
Krock21rus
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
21.07.2014, 16:49     Имитация игры с костями, вероятность шести - наибольшая #29
хватит спорить, вот вам правильный код:

C++
1
2
3
int a=rand()%100;
if(a<20) return 6;
else return rand()%5+1;
почему вы всё усложняете?

Добавлено через 53 секунды
можно обойтись без переменной, но это уже профессионально:

C++
1
2
if(rand()%100<20) return 6;
else return rand()%5+1;
Добавлено через 1 минуту
А вот вам с меньшими обьёмами данных

C++
1
2
if(rand()%5==0) return 6;
else return rand()%5+1;
Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
Vtulhu, генератор случайной последовательности есть слабое место в любом программном продукте
ибо машна не знает что есть случайность
посему и придумано куча алгоритмов и какой куда ставить решает программист
рандомность берётся из расчёта времени, так что тут очень какая максимальная рандомность, т.к. там оперируется не так что эту секунду выдаёт 1, а на следующую 2, а на следующую 3, там всё намного точнее, по операциям процессора, у каждого по разному нагружен, но если у кого-то он нагружен сильно, то и точность случайности выше.

Проводились эксперименты с подбрасыванием рубля и отчётом с шансом выпадения орла и решки, кто-то там сделал 18000 раз, и помню что в учебнике, в котором это говорилось, что чем больше экспериментов, тем больше точность, так что в программе можете сделать массив из 999999 случайных чисел, потом ещё одно случайное число и выбрать массив[случайное число], умножит это случайное число на элемент массива поделить на случайное число и тогда вам РЕАЛЬНО достанется СЛУЧАЙНОЕ число

Добавлено через 1 минуту
единственная проблема это случайные числа до 35000примерно даются, а вот если хочется больше, то без специальных алгоритмов прийдётся пожертвовать точностью
ValeryS
Модератор
6414 / 4880 / 448
Регистрация: 14.02.2011
Сообщений: 16,182
21.07.2014, 16:51     Имитация игры с костями, вероятность шести - наибольшая #30
Цитата Сообщение от Krock21rus Посмотреть сообщение
вам РЕАЛЬНО достанется СЛУЧАЙНОЕ число
любое число всегда случайное
говорить можно о последовательности
если в последовательности не наблюдается закономерности она случайная, а отдельное число с чем будешь сравнивать? какое ожидание числа?
Krock21rus
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
21.07.2014, 17:25     Имитация игры с костями, вероятность шести - наибольшая #31
Цитата Сообщение от ValeryS Посмотреть сообщение
любое число всегда случайное
говорить можно о последовательности
если в последовательности не наблюдается закономерности она случайная, а отдельное число с чем будешь сравнивать? какое ожидание числа?
повтори это 1000 раз и будет тебе РЕАЛЬНО случайная последовательность

Добавлено через 22 секунды
а лучше бесконечность раз, для точности
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 20:02     Имитация игры с костями, вероятность шести - наибольшая #32
Цитата Сообщение от Krock21rus Посмотреть сообщение
хватит спорить, вот вам правильный код:
О, еще один "находчивый" человек. Вы бы объединились с ТС в одну команду, может новый "Тупой и еще тупее"Майкрософт или Гугл получится. Может, разработаешь свой ГПСЧ? Неортодоксальные идеи из тебя так и хлещут.
А на будущее советую высказываться менее безапелляционным тоном. Просто чтобы менее смешно выглядеть, когда скажешь чушь какую-нибудь. Хотя о чем это я? Такие никогда не понимают, что сказали чушь - http://********/11qC
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2014, 21:22     Имитация игры с костями, вероятность шести - наибольшая
Еще ссылки по теме:

Наибольшая возрастающая подпоследовательность за O(NlogN) C++
C++ Вычислить значение cos шести градусов с точностью до 0,001
C++ Составить программу покрытия таблицы соответствующими доминошными костями из одного набора
C++ Вывести слова, которые состоят не из шести символов
Найти два элемента, разность которых наибольшая C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Alex5
907 / 642 / 90
Регистрация: 12.04.2010
Сообщений: 1,632
21.07.2014, 21:22     Имитация игры с костями, вероятность шести - наибольшая #33
Цитата Сообщение от Krock21rus Посмотреть сообщение
тут очень какая максимальная рандомность, т.к. там оперируется не так что эту секунду выдаёт 1, а на следующую 2, а на следующую 3, там всё намного точнее
"Тут" - это где? Что касается функции rand(), то при каждом запуске следующей программы (компилятор vs2008)

C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    srand( 4829 );
    for( int i = 0; i < 10; ++i)
    {
        cout << rand() << endl;
    }
    system("pause");
 
    return 0;
}
получается одна и та же последовательность. (Как и написано в справке: "rand() returns a pseudorandom number".)

15808
7262
9178
8851
10575
1303
30647
19483
20376
29401
Yandex
Объявления
21.07.2014, 21:22     Имитация игры с костями, вероятность шести - наибольшая
Ответ Создать тему
Опции темы

Текущее время: 11:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru