2016-06-02 13 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)을 호출하고 arc4randomsrand48 대신 random을 사용해야합니다.

내가 여기 도움이 될 것 같은 시나리오에 대한 라이브러리 썼다 :

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의 매개 변수로 위와 같이 설명 된 문자열을 기반으로 생성 된 값을 전달합니다.