2016-06-02 37 views
2

Ich möchte Zufallszahl für eine andere Zeichenfolge auswählen. Das folgende Beispiel ist ähnlich wie mein Szenario:zufällige Farbe aus einem Array für eine andere Zeichenfolge

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

was Ich mag würde zu erreichen, wird eine zufällige Farbe für eine andere Zeichenfolge immer, wenn ich die gleiche Zeichenfolge dann wieder den gleichen Index haben.

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

Was ist der beste Ansatz dabei?

+0

könnten Sie eine Eingabe- und Ausgabeeingabe geben, die Sie erwarten? –

Antwort

1

Sie können das nicht mit arc4random erreichen. Sie müssen die gesetzte Version des Zufallszahlengenerators random verwenden und sie mit einem Wert versehen, der aus Ihrer Zeichenkette kommt, der für verschiedene Zeichenkettenwerte eindeutig ist.

Das Ergebnis einer solchen Generation ist genau so, wie Sie es wollen - für denselben Seed ist die generierte Sequenz jedes Mal genau gleich. Bei verschiedenen Startwerten ist die Zufallssequenz unterschiedlich.

Zum Beispiel könnten Sie Länge der Zeichenfolge als Startwert haben, aber um es veränderbarer zu machen, könnten Sie die Summe der als int-Wert dargestellten Zeichen berechnen oder wie Sie gerade eine hash Funktion verwenden.

So in Ihrer Methode sollten Sie srandom(seed) am Anfang tun Aufruf und random statt arc4random und srand48 verwenden.

ich auch eine Bibliothek für solche Szenarien geschrieben, die hier nützlich sein wird:

https://github.com/grzegorzkrukowski/RandomUtils

zufällige Farbe zu erhalten, verwenden Sie einfach:

+ (void) setSeed:(unsigned)seed; 
+ (UIColor*) randomColorUseSeed:(BOOL)useSeed 

Wenn Sie Farben haben wollen in ein Array und nehmen Sie einfach einen dieser Indizes, Lösung ist die gleiche:

+ (void) setSeed:(unsigned)seed; 
+ (id) randomElementFromArray:(NSArray*) array useSeed:(BOOL) useSeed; 

Als Parameter für setSeed übergeben Sie einen Wert, der basierend auf Ihren wie oben beschriebenen Zeichenfolgen generiert wird.