This is SNRandom.m in view mode; [Download] [Up]
#import "Risk.h"
RCSID ("$Id: SNRandom.m,v 1.2 1997/12/15 07:44:17 nygard Exp $");
#import "SNRandom.h"
#ifndef WIN32
#import <libc.h>
#define SRANDOM(x) srandom(x)
#define RANDOM() random()
#else
#define SRANDOM(x) srand(x)
#define RANDOM() rand()
#endif
//======================================================================
// The SNRandom class provides a simple interface for random number
// generation. Different algorithms may be implemented by subclassing
// and providing a method of seeding, and of generating a long random
// number.
//======================================================================
static SNRandom *_instance = nil;
#define DK_SeedRandom @"SeedRandom"
#define SNRandom_VERSION 1
@implementation SNRandom
+ (void) initialize
{
NSUserDefaults *defaults;
NSMutableDictionary *riskDefaults;
BOOL flag;
if (self == [SNRandom class])
{
[self setVersion:SNRandom_VERSION];
// Optionally (defaults) seed here? or in +instance?
defaults = [NSUserDefaults standardUserDefaults];
riskDefaults = [NSMutableDictionary dictionary];
[riskDefaults setObject:@"YES" forKey:DK_SeedRandom];
[defaults registerDefaults:riskDefaults];
flag = [defaults boolForKey:DK_SeedRandom];
if (flag == YES)
{
[SNRandom seedGenerator:time (NULL)];
}
}
}
//----------------------------------------------------------------------
// How does subclassing affect this?
+ instance
{
if (_instance == nil)
{
_instance = [[SNRandom alloc] init];
}
return _instance;
}
//----------------------------------------------------------------------
+ (void) seedGenerator:(int)seed
{
SRANDOM (seed);
}
//----------------------------------------------------------------------
- (void) seedGenerator:(int)seed
{
SRANDOM (seed);
}
//----------------------------------------------------------------------
- (long) randomNumber
{
return RANDOM ();
}
//----------------------------------------------------------------------
- (long) randomNumberModulo:(long)modulus
{
NSAssert (modulus != 0, @"Modulus cannot be zero.");
return [self randomNumber] % modulus;
}
//----------------------------------------------------------------------
- (long) randomNumberWithMaximum:(long)maximum
{
return [self randomNumber] % (maximum + 1);
}
//----------------------------------------------------------------------
- (long) randomNumberBetween:(long)minimum:(long)maximum
{
if (maximum <= minimum)
return minimum;
return minimum + [self randomNumberWithMaximum:maximum - minimum];
}
//----------------------------------------------------------------------
#define RANGE_FOR_PERCENT 1000000000
- (double) randomPercent
{
return (double)[self randomNumberWithMaximum:RANGE_FOR_PERCENT] / RANGE_FOR_PERCENT * 100;
}
//----------------------------------------------------------------------
- (BOOL) randomBoolean
{
return [self randomNumberWithMaximum:1] == 1;
}
//----------------------------------------------------------------------
- (long) rollDieWithSides:(int)sideCount
{
return [self randomNumberBetween:1:sideCount];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.