我很想知道在数学上解决乐透需要什么。只是为了好玩。
所以如果我想赢得下周的乐透彩票,我决定确切地知道我需要购买多少张门票。
我的目标是创造每一个单一的门票
我写了一个小程序,它可以生成所有可能的乐透彩票。工作正常,但它有两个问题,我无法弄清楚如何解决:
每次我使用较大的值或较大的范围时,例如6 * 49 应用程序冻结数小时计算,最终应用程序崩溃。但 如果我试图计算小值和范围,例如所有可能的3 * 5 LOTTO门票THE PROGRAM工作正常没有崩溃(3 * 5 ==表示.... 数量*最大数量)
问题二是:我不知道如何让程序停止。一世 有一些最终结果,但我无法弄清楚得到的等式 到最后的结果或使(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
任何人都知道如何使这个程序更好?
答案 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
的所有二项式系数。