等概率色子问题

问题描述:一个色子有六(N)面,每面出现是等概率的。现使用该色子随机表示M个等概率事件。

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
#include <time.h>

#define EVENT_MAX		100

static int dice_radix; /* 基数,比如7件事色子有6面,则基数为9 */
static int event_count; /* 事件数目,比如这里的7、4、5、8、9、10 */
static int throw_times; /* 所需要掷色子次数,比如此题事件7次则需要掷2次 */
static int dice_max; /* 色子的面数,比如6 */

int init_rand(int event_count, int dice_max_count);
int get_rand(void);

int main(int argc, char *argv[])
{
	int i;
	int ret[EVENT_MAX];
	memset(ret, 0, sizeof(ret));
	init_rand(7, 6);
	printf("%d, %d, %d, %d...\n", dice_radix, event_count, throw_times, dice_max);
	for(i=0; i<10000; ++i) {
		ret[get_rand()]++;
	}
	int total = 0;
	for(i=0; i<event_count; ++i) {
		total += ret[i];
		printf("event[%2d]=%4d...\n", i, ret[i]);
	}
	printf("\ntotal=%d...\n", total);
	return 0;
}

static time_t rand_pip;
int init_rand(int count, int dice_max_count)
{
	dice_radix = dice_max_count;
	event_count = count;
	throw_times = 1;
	dice_max = dice_max_count;
	if(count<=0) {
		return -1;
	}
	while(dice_radix < count) {
		++throw_times;
		dice_radix *= dice_max_count;
	}
	while(dice_radix%count!=0) {
		++count;
	}
	dice_radix = count;
	rand_pip = time(NULL);
	return 0;
}

int get_rand(void)
{
	int ret;
	int i;
	do {
		rand_pip += 100;
		srand(rand_pip);
		ret = 0;
		for(i=0; i<throw_times; ++i) {
			ret *= dice_max;
			ret += rand()%dice_max;
		}
		ret = rand()%dice_radix;
	} while(ret>=event_count);
	return ret;
}
运行结果:
9, 7, 2, 6...
event[ 0]=1450...
event[ 1]=1433...
event[ 2]=1456...
event[ 3]=1397...
event[ 4]=1472...
event[ 5]=1408...
event[ 6]=1384...

total=10000...


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值