乐透破坏者计划是如何计算的

时间:2013-08-10 03:48:35

标签: objective-c arrays nsset equation-solving

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

所以如果我想赢得下周的乐透彩票,我决定确切地知道我需要购买多少张门票。

我的目标是创造每一个单一的门票

我写了一个小程序,它可以生成所有可能的乐透彩票。工作正常,但它有两个问题,我无法弄清楚如何解决:

  1. 每次我使用较大的值或较大的范围时,例如6 * 49 应用程序冻结数小时计算,最终应用程序崩溃。但 如果我试图计算小值和范围,例如所有可能的3 * 5 LOTTO门票THE PROGRAM工作正常没有崩溃(3 * 5 ==表示.... 数量*最大数量)

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

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

    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
    

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

1 个答案:

答案 0 :(得分:4)

如果我正确理解您的问题,您正在尝试计算方法的数量 从k中选择n个不同的项目。该号码由"Binomial coefficient" 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的所有二项式系数。