Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Комбинаторика и вероятность в java, java вычисления факториала и не только 
:(
    Опции темы
Atum
Дата 1.3.2013, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Добрый день ! 

возник вопрос , задача -
На сайте http://sportloto.pp.ru/content/view/44/15/#tabl есть формула расчета для игры КЕНО.

при этом в коде страницы расчет идет с помощью javascript ! и там в легкую перемножаются факториалы 60! 10! итд 

вопрос как ? 

я взял для расчета такие числа  a=20 n =80 m=10 k =5
Сайт мне выдал значение : 0.05142768770500134

взяв за основу формулу которая выведена на странице  я подставил значения и сократил числа - , потом перемножил и у меня этот ответ с полученным мной не сошелся ! 

Отсюда задачка : 
понятно что перемножать числа и факториалы для таких формул достаточно бессмысленно! 

Вопрос как на java  написать функцию расчета такой вероятности ?  можно ли с хорошей точностью упростить эту функцию ? 


a — количество номеров, которые выпадут в тираже;
n — количество номеров, которые участвуют в лотерее;
m — количество номеров, которые выбираются игроком на одну ставку;
k — количество номеров, для которого рассчитывается вероятность угадывания.


user posted image

PM MAIL   Вверх
k0rvin
Дата 2.3.2013, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Atum @  1.3.2013,  15:48 Найти цитируемый пост)
при этом в коде страницы расчет идет с помощью javascript ! и там в легкую перемножаются факториалы 60! 10! итд 

вопрос как ? 


Вот так?

Это сообщение отредактировал(а) k0rvin - 2.3.2013, 12:29


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
k0rvin
Дата 2.3.2013, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Собственно достаточно открыть исходный код страницы и увидеть
Код

function calc_keno_p(f) {
  var a = parseInt(f.a.value);
  var n = parseInt(f.n.value);
  var k = parseInt(f.k.value);
  var m = parseInt(f.m.value);
  f.c.value = (calc_c(n, m)).toFixed(0);
  f.p.value = ( factorial(a)*factorial(m)*factorial(n-a)*factorial(n-m)/( factorial(k)*factorial(n)*factorial(a-k)*factorial(m-k)*factorial(n-a-m+k) ) ).toFixed(17);
}



--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Atum
Дата 4.3.2013, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Цитата(k0rvin @ 2.3.2013,  12:30)
Собственно достаточно открыть исходный код страницы и увидеть
Код

function calc_keno_p(f) {
  var a = parseInt(f.a.value);
  var n = parseInt(f.n.value);
  var k = parseInt(f.k.value);
  var m = parseInt(f.m.value);
  f.c.value = (calc_c(n, m)).toFixed(0);
  f.p.value = ( factorial(a)*factorial(m)*factorial(n-a)*factorial(n-m)/( factorial(k)*factorial(n)*factorial(a-k)*factorial(m-k)*factorial(n-a-m+k) ) ).toFixed(17);
}

Это я видел ! с таким же успехом я могу написать код на java 

Код

    public static double factorial(int n) {
        double r = 1;
        for (int i = 1; i <= n; i++) {
            r *= i;
        }
        return r;
    }


 и получать буду точно такие же значения ! 

Вопрос в том что точность таких вычислений очень сильно страдает ! 

вопрос как рассчитать с нормальной точностью - как упростить формулу для расчета вероятности ! 


Это сообщение отредактировал(а) Atum - 4.3.2013, 09:24
PM MAIL   Вверх
k0rvin
Дата 4.3.2013, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



А, так тебе просто BigDecimal нужен:

Код

package vpf;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Keno {

    public static BigDecimal factorial(BigDecimal n) {
        BigDecimal result = BigDecimal.ONE;
        BigDecimal x = BigDecimal.ONE;
        while (x.compareTo(n) <= 0) {
            result = result.multiply(x);
            x = x.add(BigDecimal.ONE);
        }
        return result;
    }

    public static BigDecimal factorial(long n) {
        return factorial(BigDecimal.valueOf(n));
    }

    public static BigDecimal keno(long a, long n, long m, long k) {
        BigDecimal n1 = factorial(a);
        BigDecimal n2 = factorial(m);
        BigDecimal n3 = factorial(n - a);
        BigDecimal n4 = factorial(n - m);
        BigDecimal numer = n1.multiply(n2).multiply(n3).multiply(n4);

        BigDecimal d1 = factorial(k);
        BigDecimal d2 = factorial(n);
        BigDecimal d3 = factorial(a - k);
        BigDecimal d4 = factorial(m - k);
        BigDecimal d5 = factorial(n - a - m + k);
        BigDecimal denom = d1.multiply(d2).multiply(d3).multiply(d4).multiply(d5);

        return numer.divide(denom, 24, RoundingMode.CEILING);
    }

    public static void main(String[] args) {
        System.out.println("0.05142768770500134");
        System.out.println(keno(20, 80, 10, 5));
    }
}


Код

0.05142768770500134
0.051427687705001317908168



--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Atum
Дата 5.3.2013, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Да все точно , просто Подсократил факториалы по формуле ! 
И ошибка появилась - из за этого результат не сошелся !


Код

P = ( 10! * 20! * 60! * 70! ) / (5! * 5!* *15! *55! * 80!  )



вот что получается в числителе и знаменателе после упрощения :  
Код

BigDecimal A1 = BigDecimal.valueOf(6*7*8*9*10);        
BigDecimal A2 = BigDecimal.valueOf(16*17*18*19*20);        
BigDecimal A3 = BigDecimal.valueOf(56*57*58*59*60);        

BigDecimal N11 = BigDecimal.valueOf(71*72*73*74*75);
BigDecimal N12 = BigDecimal.valueOf(76*77*78);
BigDecimal N13 = BigDecimal.valueOf(79*80);

BigDecimal N2 = BigDecimal.valueOf(1*2*3*4*5);


  BigDecimal numer = A1.multiply(A2).multiply(A3);
  BigDecimal denom = N11.multiply(N12).multiply(N13).multiply(N2);

  BigDecimal res =   numer.divide(denom, 24, RoundingMode.CEILING);    
  System.out.println("P = "+  res);


Код

P = 0.051427687705001317908168


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.