1. 從一個(gè)范圍內(nèi)獲取一組不重復(fù)的隨機(jī)數(shù),返回這個(gè)數(shù)組:
頭文件:
/*
獲取隨機(jī)數(shù)
@param count獲取隨機(jī)數(shù)的個(gè)數(shù)
@param from隨機(jī)數(shù)的最小值
@param to最大值
@return一組隨機(jī)數(shù)
*/
+ (NSMutableArray*)getRandomArrayOfCount: (NSInteger)count rangeFrom:(NSInteger)from to:(NSInteger)to;
實(shí)現(xiàn):
+ (NSMutableArray*)getRandomArrayOfCount:(NSInteger)count rangeFrom:(NSInteger)from to:(NSInteger)to {
if(to-from+1< count) {
VDLog(@"個(gè)數(shù)超出取值范圍");
return nil;
}
NSMutableArray*array = [NSMutableArray new];
for(; ; ) {
NSString*object = [NSString stringWithFormat:@"%ld", from+arc4random()%(to-from+1)];
if(array.count==0) {
[array addObject:object];
continue;//數(shù)組元素個(gè)數(shù)為空,添加隨機(jī)數(shù),跳出本次循環(huán)
}
if([array containsObject:object]) {
continue;//數(shù)組內(nèi)包含本次循環(huán)的隨機(jī)數(shù),跳出本次循環(huán)
}
[array addObject:object];
if(array.count== count) {
return array;//個(gè)數(shù)達(dá)到要求,循環(huán)結(jié)束
}
}
}
2.組合算法
頭文件:
/**
計(jì)算出排列組合個(gè)數(shù)
例如從11個(gè)中選取5個(gè),totalNum就是11,pickNum就是5
@param picNum目標(biāo)個(gè)數(shù)
@param totalNum抽取對(duì)象個(gè)數(shù)
@return所有的排列組合的個(gè)數(shù)
*/
+ (NSInteger)getAllNumOfPossibleWithPicNum:(NSInteger)picNum totalNum:(NSInteger)totalNum;
實(shí)現(xiàn):
+ (NSInteger)getAllNumOfPossibleWithPicNum:(NSInteger)picNum totalNum:(NSInteger)totalNum {
if(picNum > totalNum) {
return 0;
}
else{
NSInteger num1 = [self factorialWithStartNumber:totalNum - picNum +1 endNumber:totalNum];
NSInteger num2 = [self factorialWithStartNumber:1 endNumber:picNum];
returnnum1/num2;
}
}
/**
階乘
@param startNumber起始數(shù)
@param endNumber結(jié)束數(shù)
@return階乘結(jié)果
*/
+ (NSInteger)factorialWithStartNumber:(NSInteger)startNumber
endNumber:(NSInteger)endNumber
{
NSInteger result =1;
for(; startNumber <= endNumber; startNumber ++) {
result = result * startNumber;
}
returnresult;
}