Comment detail

n人中m人が当選するくじ (Nested Flatten)
アレイのuniqと似てるなぁ。
ちなみにn < mだと全員当選します。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#import <Foundation/Foundation.h>
#import <stdio.h>

@interface NSArray (Random)
- (NSArray *)objectsAtRandom:(int)number;
@end

@implementation NSArray (Random)
- (NSArray *)objectsAtRandom:(int)m
{
    int n = [self count];
    id selected;
    if (m >= n)
    {
        selected = self;
    }
    else
    {
        srand(time(nil));
        NSMutableDictionary* winnerTable = [NSMutableDictionary dictionary];
        selected = [NSMutableArray array];
        id winner;
        while ([selected count] < m)
        {
            winner = [self objectAtIndex:(rand()%n)];
            if (![winnerTable objectForKey:winner])
            {
                [winnerTable setObject:winner forKey:winner];
                [selected addObject:winner];
            }
        }
    }
    return selected;
}
@end

int main(int argc, const char * argv[])
{
    NSAutoreleasePool* pool = [NSAutoreleasePool new];

    if (argc < 3) {
        printf("Usage: %s n player1[,player2...]\n", argv[0]);
        return 1;
    }

    NSArray* players = [[NSString stringWithCString:argv[2] encoding:NSUTF8StringEncoding] componentsSeparatedByString:@","];
    for (id winner in [players objectsAtRandom:atoi(argv[1])])
    {
        printf("%s\n", [winner cStringUsingEncoding:NSUTF8StringEncoding]);
    }

    [pool release];
    return 0;
}

Index

Feed

Other

Link

Pathtraq

loading...