我目前在iOS中使用随机数生成器方法。虽然它工作正常,但我想修改它,使其在输出中始终包含至少一个数字。我该怎么做?这是我正在使用的随机数方法:
- (NSString *)generateRandString {
NSString *alphabet = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
NSMutableString *s = [NSMutableString stringWithCapacity:5];
for (NSUInteger i = 0U; i < 5; i++) {
u_int32_t r = arc4random() % [alphabet length];
unichar c = [alphabet characterAtIndex:r];
[s appendFormat:@"%C", c];
}
return s;
}
感谢所有回复的人。
答案 0 :(得分:3)
这是我编辑和检查的解决方案:
- (NSString *)generateRandString {
NSString *alphabet = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
NSMutableString *s;
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
do
{
s = [NSMutableString stringWithCapacity:5];
for (NSUInteger i = 0U; i < 5; i++)
{
u_int32_t r = arc4random() % [alphabet length];
unichar c = [alphabet characterAtIndex:r];
[s appendFormat:@"%C", c];
}
}
while ([s rangeOfCharacterFromSet:set].location == NSNotFound);
return s;
}
我也实施了Dan Dyer建议的解决方案(这显然比我的好)。我的实现可能并不完美(我使用相同的功能几次而不是为它创建一个单独的功能,但我相信它并不难为你实现)但它的工作方式与Dan提出的完全相同。
NSString *alphabet = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
NSMutableString *s = [NSMutableString string];
NSCharacterSet *set = [NSCharacterSet decimalDigitCharacterSet];
NSString *digits = @"0123456789";
for (NSUInteger i = 0U; i < 4; i++)
{
u_int32_t r = arc4random() % [alphabet length];
unichar c = [alphabet characterAtIndex:r];
[s appendFormat:@"%C", c];
}
if ([s rangeOfCharacterFromSet:set].location == NSNotFound)
{
u_int32_t r = arc4random() % [digits length];
unichar c = [digits characterAtIndex:r];
[s appendFormat:@"%C", c];
}
else
{
u_int32_t r = arc4random() % [alphabet length];
unichar c = [alphabet characterAtIndex:r];
[s insertString:[NSString stringWithFormat:@"%C", c] atIndex:arc4random() % s.length];
}
答案 1 :(得分:2)
而不是生成整个字符串然后拒绝它,如果它不包含任何数字,这可能需要多次迭代才能生成有效的字符串(您生成的任何5个字符的字符串有41.5%的可能性赢得' t包含一个数字),一种更有效的方法是在生成字符串时保持跟踪。
如果要生成5个字符的字符串,请先生成4个字符。如果其中至少有一个是数字,则可以正常生成第五个字符。如果不是,则仅从第五个字符的数字集中选择。如果你想避免偏向数字位置,你可以在随机位置插入第五个字符,而不是在最后添加它。