数组中不同字符串的随机颜色
random color from an array for a different string
我想为不同的字符串选择随机数。以下示例与我的场景类似:
+ (UIColor *)ivl_randomColorWithSeedString:(NSString *)seedString {
srand48(seedString ? seedString.hash : arc4random());
float red = 0.0;
while (red < 0.1 || red > 0.84) {
red = drand48();
}
float green = 0.0;
while (green < 0.1 || green > 0.84) {
green = drand48();
}
float blue = 0.0;
while (blue < 0.1 || blue > 0.84) {
blue = drand48();
}
return [UIColor colorWithRed:red green:green blue:blue alpha:1.0f];
}
我想要实现的是为不同的字符串获取随机颜色,如果我有相同的字符串,那么 return 相同的索引。
- (void)setImageWithImage:(UIImage *)image orString:(NSString *)string colorArray:(NSArray *)colorArray circular:(BOOL)isCircular textAttributes:(NSDictionary *)textAttributes {
if (!textAttributes) {
textAttributes = @{
NSFontAttributeName: [self fontForFontName:nil],
NSForegroundColorAttributeName: [UIColor whiteColor]
};
}
NSMutableString *displayString = [NSMutableString stringWithString:@""];
NSMutableArray *words = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] mutableCopy];
//
// Get first letter of the first and last word
//
if ([words count]) {
NSString *firstWord = [words firstObject];
if ([firstWord length]) {
// Get character range to handle emoji (emojis consist of 2 characters in sequence)
NSRange firstLetterRange = [firstWord rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 1)];
[displayString appendString:[firstWord substringWithRange:firstLetterRange]];
}
if ([words count] >= 2) {
NSString *lastWord = [words lastObject];
while ([lastWord length] == 0 && [words count] >= 2) {
[words removeLastObject];
lastWord = [words lastObject];
}
if ([words count] > 1) {
// Get character range to handle emoji (emojis consist of 2 characters in sequence)
NSRange lastLetterRange = [lastWord rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 1)];
[displayString appendString:[lastWord substringWithRange:lastLetterRange]];
}
}
}
srand48(string ? string.hash : arc4random());
NSUInteger randomIndex = arc4random() % [colorArray count];
UIColor *backgroundColor = colorArray[randomIndex];
if (image != nil) {
self.image = image;
} else {
self.image = [self imageSnapshotFromText:[displayString uppercaseString] backgroundColor:backgroundColor circular:isCircular textAttributes:textAttributes];
}
}
最好的方法是什么?
arc4random
无法做到这一点。您需要使用随机数生成器的种子版本 random
并使用来自您的字符串的值为其播种,该值对于不同的字符串值是唯一的。
这种生成的结果完全如你所愿——对于相同的种子,每次生成的序列都将完全相同。
对于不同的种子值,随机序列会有所不同。
例如,您可以将字符串的长度作为种子,但为了使其更加可变,您可以计算表示为 int 值的字符总和,或者像您现在所做的那样使用 hash
函数。
所以在你的方法中你应该在开始时调用 srandom(seed)
并使用 random
而不是 arc4random
和 srand48
.
我也为这种场景写了一个库,在这里会有用:
https://github.com/grzegorzkrukowski/RandomUtils
要获得随机颜色,只需使用:
+ (void) setSeed:(unsigned)seed;
+ (UIColor*) randomColorUseSeed:(BOOL)useSeed
如果你想在一个数组中包含颜色并且只取其中一个索引,解决方案是相同的:
+ (void) setSeed:(unsigned)seed;
+ (id) randomElementFromArray:(NSArray*) array useSeed:(BOOL) useSeed;
作为 setSeed
的参数,传递一个根据上述字符串生成的值。
我想为不同的字符串选择随机数。以下示例与我的场景类似:
+ (UIColor *)ivl_randomColorWithSeedString:(NSString *)seedString {
srand48(seedString ? seedString.hash : arc4random());
float red = 0.0;
while (red < 0.1 || red > 0.84) {
red = drand48();
}
float green = 0.0;
while (green < 0.1 || green > 0.84) {
green = drand48();
}
float blue = 0.0;
while (blue < 0.1 || blue > 0.84) {
blue = drand48();
}
return [UIColor colorWithRed:red green:green blue:blue alpha:1.0f];
}
我想要实现的是为不同的字符串获取随机颜色,如果我有相同的字符串,那么 return 相同的索引。
- (void)setImageWithImage:(UIImage *)image orString:(NSString *)string colorArray:(NSArray *)colorArray circular:(BOOL)isCircular textAttributes:(NSDictionary *)textAttributes {
if (!textAttributes) {
textAttributes = @{
NSFontAttributeName: [self fontForFontName:nil],
NSForegroundColorAttributeName: [UIColor whiteColor]
};
}
NSMutableString *displayString = [NSMutableString stringWithString:@""];
NSMutableArray *words = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] mutableCopy];
//
// Get first letter of the first and last word
//
if ([words count]) {
NSString *firstWord = [words firstObject];
if ([firstWord length]) {
// Get character range to handle emoji (emojis consist of 2 characters in sequence)
NSRange firstLetterRange = [firstWord rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 1)];
[displayString appendString:[firstWord substringWithRange:firstLetterRange]];
}
if ([words count] >= 2) {
NSString *lastWord = [words lastObject];
while ([lastWord length] == 0 && [words count] >= 2) {
[words removeLastObject];
lastWord = [words lastObject];
}
if ([words count] > 1) {
// Get character range to handle emoji (emojis consist of 2 characters in sequence)
NSRange lastLetterRange = [lastWord rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 1)];
[displayString appendString:[lastWord substringWithRange:lastLetterRange]];
}
}
}
srand48(string ? string.hash : arc4random());
NSUInteger randomIndex = arc4random() % [colorArray count];
UIColor *backgroundColor = colorArray[randomIndex];
if (image != nil) {
self.image = image;
} else {
self.image = [self imageSnapshotFromText:[displayString uppercaseString] backgroundColor:backgroundColor circular:isCircular textAttributes:textAttributes];
}
}
最好的方法是什么?
arc4random
无法做到这一点。您需要使用随机数生成器的种子版本 random
并使用来自您的字符串的值为其播种,该值对于不同的字符串值是唯一的。
这种生成的结果完全如你所愿——对于相同的种子,每次生成的序列都将完全相同。 对于不同的种子值,随机序列会有所不同。
例如,您可以将字符串的长度作为种子,但为了使其更加可变,您可以计算表示为 int 值的字符总和,或者像您现在所做的那样使用 hash
函数。
所以在你的方法中你应该在开始时调用 srandom(seed)
并使用 random
而不是 arc4random
和 srand48
.
我也为这种场景写了一个库,在这里会有用:
https://github.com/grzegorzkrukowski/RandomUtils
要获得随机颜色,只需使用:
+ (void) setSeed:(unsigned)seed;
+ (UIColor*) randomColorUseSeed:(BOOL)useSeed
如果你想在一个数组中包含颜色并且只取其中一个索引,解决方案是相同的:
+ (void) setSeed:(unsigned)seed;
+ (id) randomElementFromArray:(NSArray*) array useSeed:(BOOL) useSeed;
作为 setSeed
的参数,传递一个根据上述字符串生成的值。