-5

我很好奇在数学上解决乐透需要什么。只是为了好玩。

所以我决定弄清楚如果我想赢得下周的乐透,我需要买多少张彩票。

我的目标是创造每一张可能的票

我写了一个小程序,它可以生成所有可能的 Lotto Ticket。工作正常,但它有两个我不知道如何解决的问题:

  1. 每次我使用较大的值或较大的范围(例如 6*49)时,应用程序会冻结数小时计算,最终应用程序崩溃。但是,如果我尝试计算小的值和范围,例如所有可能的 3*5 LOTTO 彩票,该程序运行良好没有崩溃(3*5== 表示 .... 数字数量*最大数字)

  2. 问题二是:我不知道如何让程序停止。我有一些最终结果,但我无法弄清楚得到最终结果的方程式或使(WHILE LOOP STOP)程序停止工作。目前我只是设置它,如果它产生一百万张重复票。没有更多可能的门票了,现在退出。

我从实验中得到的结果是:

3*3=1                   

3*4=4 

3*5=10 ( ie 10 maximum possible tickets)

3*6=20

3*7=35

3*8=56

或者如果我使用 4s

4*4=1

4*5=5

4*6=15

4*7=35

4*8=70

或者如果我使用 6s

6*6=1

6*7=7

6*8=28

6*9=84

有一个网站可以很容易地计算它,但我不知道方程是什么:

http://www.lotterynumberspro.com/lottery-odds-calculator.php

到目前为止我的代码

 //******************************Start Values*******************************************************************************

    NSMutableArray*starArray=[[NSMutableArray alloc]initWithCapacity:Rangesize];
    NSMutableSet *aSet;
    int x;
    for (x=1; x<=Rangesize; x++) {[starArray addObject:@(x)] ;}

    NSMutableArray*allStartValues=[[NSMutableArray alloc]initWithArray:starArray];

    NSLog(@"First ticket = %@",[allStartValues componentsJoinedByString:@"_"]);


    //***************************Master Array with one object*****************
    NSMutableArray*masterArray=[[NSMutableArray alloc]initWithObjects:allStartValues, nil];

    NSLog(@"The masterArray initialized  = %@",[masterArray componentsJoinedByString:@"_"]);





    //****************************************Search Master for instances of new ticket*************
    int count=0;
    NSMutableString *string = [NSMutableString string];

    while ([masterArray containsObject:allStartValues]&& count<=100000) {


        NSMutableSet *aSet2=[[NSMutableSet alloc]initWithCapacity:Rangesize];

        while(([aSet2 count]!=Rangesize))
        {
            int Randnum = (arc4random() % BnSize)+1;
            [aSet2 addObject:[NSNumber numberWithInt:Randnum]];
        }

        NSArray *arrayOfUniqueRandomNumbers = [aSet2 allObjects];
        NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" ascending: YES];
        NSArray*new=[arrayOfUniqueRandomNumbers sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];





        for(NSArray*EachElement in masterArray)
        {

            if ([masterArray containsObject:new]) {

                count++;
                break;
            }

            else {
 NSLog(@"ticket %@  Pass to add to Master",[new componentsJoinedByString:@"_"]);
                [masterArray addObject:new];
              //  NSLog(@"The masterArray updated  = %@",[masterArray componentsJoinedByString:@"_"]);
                break;
            }
        }       
    }

    int c=1;
    for (NSArray*element in masterArray) {

        [string appendString:[NSString stringWithFormat:@"Ticket (%i) is >> %@  \n",c ,[element componentsJoinedByString:@"_"]]];          

        _Scroll.text=string;
        c++;
        //NSLog(@"array size = %i",[masterArray count]);

    }
    }

@end

任何人都知道如何使这个程序更好?

4

1 回答 1

4

如果我正确理解您的问题,您正在尝试计算kn. 该数字由“二项式系数”给出 C(n, k)

例如,从 1、...、7 中选择 4 个不同数字的可能性为 C(7, 4) = 35

无需实际创建所有可能的组合即可计算二项式系数

          n  * (n-1) * (n-2) * ... * (n-k+1)
C(n, k) = ----------------------------------
          1  *   2   *   3   * ... *    k

补充:( 回应您的评论)没有必要为了计算而计算阶乘C(n, k)。换句话说,通常不会使用该公式 C(n, k) = n! / (k! * (n-k)!),因为阶乘变得非常大。

相反,您在表格中使用上述表达式

          n    (n-1)   (n-2)          (n-k+1)
C(n, k) = -  * ----- * -----  * ... * -------
          1      2       3               k

一个简单的实现可能如下所示:

long long int choose(int n, int k)
{
    if (k < 0 || k > n)
        return 0;

    long long int result = 1;
    // Use the fact that C(n, k) == C(n, n-k) to reduce k:
    if (k > n - k)
        k = n - k;
    for (int i = 1; i <= k; i++) {
        result = (result * (n+1-i)) / i;
    }

    return result;
}

当然,如果数字太大,这也会溢出。但是(因为long long int至少有 64 位)这足以计算所有二项式系数直到n = 60.

于 2013-08-10T04:15:58.877 回答