2016-06-02 2 views
2

Я хотел бы выбрать случайное число для другой строки. Следующий пример аналогичен мой сценарий:случайный цвет из массива для другой строки

+ (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]; 
} 

, что я хотел бы достичь получаю случайный цвет для другой строки, если у меня есть то же строка возвращает тот же индекс.

- (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]; 
    } 
} 

Каков наилучший подход к этому вопросу?

+0

Можете ли вы дать пример ввода и вывода, который вы ожидаете? –

ответ

1

Вы не сможете достичь этого с помощью 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 передайте значение, сгенерированное на основе ваших строк, описанных выше.

Смежные вопросы