Нужен эмулятор следующей ситуации:
В корзине лежит Y шаров, X из которых белого цвета.
Игрок наугад вытаскивает N шаров.
Требуется определить сколько белых шаров игрок вытащил.
Что-то я уперся в стенку
никак не найду подходящую формулу расчета ![]()
может быть кто-нибудь сталкивался с подобной задачей? ![]()
Неактивен
ASBer :
при повторении каждый раз должна быть другая последовательность вытащенных камней.
для одного камня вероятность определяется простым соотношением белых камней к камням в корзине.
можно конечно сделать цикл от 1 до N и таскать камни по одному, но некрасиво...
Я бы сделал так:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int takeWhiteCount( int takeTotal, int m, int n )
{
int res = 0;
int i;
for ( i = 0; i < takeTotal; i++ ) {
if ( (rand() % n) < m ) {
res++;
m--;
}
n--;
}
return res;
}
int main()
{
int takeTotal, m = 5, n = 10;
printf("Сколько шаров вы хотите взять: ");
scanf("%d", &takeTotal);
srand( (unsigned)time(NULL) );
printf("Вытащено белых шаров: %d\n", takeWhiteCount(takeTotal, m, n));
return 0;
}Неактивен
ASBer написал:
Только ограничил takeTotal<=100, т.к. при takeTotal=1000000 даже современные компы зависают на недопустимо длительное время.
И всеже очень надеюсь что существуют решения без использования циклов.
Не знаю даже, у меня при takeTotal = 10^7 (m=10^7 и n=2*10^7) за секунду посчитал (реультат = 5011437).
Только, если тебе нужны такие порядки, то в takeWhiteCount() функцию rand() нужно заменить на следующую:
int bigrand()
{
return RAND_MAX*rand() + rand();
}А поповоду "формульного" решения не знаю, я в математике, в том числе в ТВ, не силен. Можно спросить на мат. форумах (в случае ответа не забудь отписаться ![]()
З.Ы.
В каком контексте возникли эти замечательные монохромные шары? Возможно, ты решаешь немного не ту задачу.
З.З.Ы
Очень не советую браться за написание своей платформы.
Отредактировано tadsloser (19.03.2008 00:45)
Неактивен
Я, чет тоже не улавливаю, у тебя результат не зависит от первоначальной комбинации шаров?
Неактивен