100 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| rnd.c
 | |
| 
 | |
| Generate random numbers
 | |
| */
 | |
| 
 | |
| #define _POSIX_SOURCE
 | |
| 
 | |
| #include <stdarg.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| static char *progname;
 | |
| 
 | |
| static void fatal(char *fmt, ...);
 | |
| static void usage(void);
 | |
| 
 | |
| int main(int argc, char *argv[])
 | |
| {
 | |
| 	int c, i, count;
 | |
| 	unsigned long n, v, high, modulus;
 | |
| 	unsigned seed;
 | |
| 	char *check;
 | |
| 	char *c_arg, *m_arg, *s_arg;
 | |
| 
 | |
| 	(progname=strrchr(argv[0],'/')) ? progname++ : (progname=argv[0]);
 | |
| 
 | |
| 	c_arg= m_arg= s_arg= NULL;
 | |
| 	while (c= getopt(argc, argv, "?c:m:s:"), c != -1)
 | |
| 	{
 | |
| 		switch(c)
 | |
| 		{
 | |
| 		case 'c': c_arg= optarg; break;
 | |
| 		case 'm': m_arg= optarg; break;
 | |
| 		case 's': s_arg= optarg; break;
 | |
| 		default:
 | |
| 			fatal("getopt failed: '%c'", c);
 | |
| 		}
 | |
| 	}
 | |
| 	if (optind != argc)
 | |
| 		usage();
 | |
| 	if (c_arg)
 | |
| 	{
 | |
| 		count= strtol(c_arg, &check, 0);
 | |
| 		if (check[0] != '\0')
 | |
| 			fatal("bad count '%s'", c_arg);
 | |
| 	}
 | |
| 	else
 | |
| 		count= 1;
 | |
| 	if (m_arg)
 | |
| 	{
 | |
| 		modulus= strtoul(m_arg, &check, 0);
 | |
| 		if (check[0] != '\0' || modulus == 0)
 | |
| 			fatal("bad modulus '%s'", m_arg);
 | |
| 		n= 0x80000000UL / modulus;
 | |
| 		if (n == 0)
 | |
| 			fatal("bad modulus %lu (too big)", modulus);
 | |
| 		high= n * modulus;
 | |
| 	}
 | |
| 	else
 | |
| 		modulus= high= 0x80000000UL;
 | |
| 	if (s_arg)
 | |
| 	{
 | |
| 		seed= strtol(s_arg, &check, 0);
 | |
| 		if (check[0] != '\0')
 | |
| 			fatal("bad seed '%s'", s_arg);
 | |
| 		srandom(seed);
 | |
| 	}
 | |
| 
 | |
| 	for (i= 0; i<count; i++)
 | |
| 	{
 | |
| 		do
 | |
| 		{
 | |
| 			v= random();
 | |
| 		} while (v > high);
 | |
| 
 | |
| 		printf("%lu\n", v % modulus);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static void fatal(char *fmt, ...)
 | |
| {
 | |
| 	va_list ap;
 | |
| 
 | |
| 	fprintf(stderr, "%s: ", progname);
 | |
| 	va_start(ap, fmt);
 | |
| 	vfprintf(stderr, fmt, ap);
 | |
| 	va_end(ap);
 | |
| 	fprintf(stderr, "\n");
 | |
| 	exit(1);
 | |
| }
 | |
| 
 | |
| static void usage(void)
 | |
| {
 | |
| 	fprintf(stderr, "Usage: rnd [-c <count>] [-m <modulus>] [-s <seed>]\n");
 | |
| 	exit(1);
 | |
| }
 | 
