这一章的密码生成器涉及到宏定义,随机数random、srandom,NSRange,StringWithRange.
random为伪随机srandom为随机种子,使用srandom()函数赋随机数种子值。然后再使用random来产生随机数
随机种子是用来产生随机数的。如果不用SRandom设定种子数,Random会使用当前系统运行过的毫秒数(?)作为随机种子。
Random就是通过对种子数进行一系列复杂的运算计算出随机数的。
这一系列复杂的运算,你可以理解为“计算种子数的k次方,将结果的第n-m位作为下一次迭代的种子,重复计算k次之后,取当前鼠标的xy坐标,将x减去y,取其绝对值z,将运算结果的k到z位作为返回值,并将此返回值作为下一次计算随机数的种子”。
#define RANDOM_SEED() srandom(time(NULL)) //定义随机整数值,使用MIN,MAX和random计算返回的整数值为min+(random/((max+1)-min)) #define RANDOM_INT(__MIN__, __MAX__) ((__MIN__) + random() % ((__MAX__+1) - (__MIN__))) //文本框控件输入返回判定方法 - (BOOL)textFieldShouldReturn:(UITextField *)textField { if (textField == password) { [password resignFirstResponder]; } if (textField == passwordlength) { [passwordlength resignFirstResponder]; } return YES; } - (IBAction)setPassword{ //获取输入密码的长度整数 NSInteger iPassswordLength = [passwordlength.text intValue]; //创建判定逻辑对象,密码中字母小写生成的开关控件的属性值为打开 BOOL bIncludeLowerCase = includeLowerCase.on; //创建判定逻辑对象,密码中字母大写生成的开关控件的属性值为打开 BOOL bIncludeUpperCase = includeUpperCase.on; //创建判定逻辑对象,密码中数字生成的开关控件的属性值为打开 BOOL bIncludeNumbers = includeNumbers.on; //密码文字定义为空 NSString* passwordText = @""; NSString* lowercaseChars = @"abcdefghijklmnopqrstuvwxyz"; NSString* uppercaseChars = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ"; NSString* numbersChars = @"0123456789"; //使用宏定义中的随机变量 RANDOM_SEED(); NSString* passwordChars = @""; if(bIncludeLowerCase) //获取小写字母字符,获取的数据转换为文字格式 passwordChars = [NSString stringWithFormat:@"%@%@", passwordChars, lowercaseChars]; if(bIncludeUpperCase) passwordChars = [NSString stringWithFormat:@"%@%@", passwordChars, uppercaseChars]; if(bIncludeNumbers) passwordChars = [NSString stringWithFormat:@"%@%@", passwordChars, numbersChars]; //数值从0开始,当数值小于密码长度时,数值加1循环 for(NSInteger i=0; i<iPassswordLength; i++) { //数值为宏定义中获取从0到密码字符长度-1,返回的整数值为min+(random/((max+1)-min)) int index = RANDOM_INT(0, [passwordChars length]-1); //NSRange定义起始位置和所需的元素数量,创建范围变量对象,其中index为起始的位置,1为字符的数量,获取一个字符特征值 NSRange range = NSMakeRange(index, 1); //创建密码中单个字符的字符变量对象,文字位置和数量为范围变量对象 NSString *passwordChar = [passwordChars substringWithRange:range]; //在密码字符变量获取数据转换为文字格式 passwordText = [NSString stringWithFormat:@"%@%@", passwordText, passwordChar]; } //密码变量定义为空 password.text = @""; //密码变量的文字替换为passwordText password.text = passwordText; }