满意答案
hsly152
2013.11.22
采纳率:40% 等级:12
已帮助:22611人
模拟信源生成词表?随便手写一下。这里输入的概率用的是各自的出现次数,所以都是整数。
要使用计算出来的非整数概率,直接修改 P 的类型和输入环节即可。
int R = 0, *P = NULL;
char *C = NULL;
void init( int r ) {
int i, s, t;
R = r > 0 ? r : 1;
P = realloc( P, (R+1)*sizeof(*P) );
C = realloc( C, (R+1)*sizeof(*C) );
for ( i=0; i
scanf( "%c %d", &C[i], &P[i] );
for ( s=i=0; i
t = s + P[i], P[i] = s, s = t;
P[R] = s;
}
char *gen( int n, char *buf ) {
const int M = P[R];
int i, j;
for ( i=0; i
int r = random() % M;
for ( j=0; r > P[j+1]; j++ );
buf[i] = C[j];
}
buf[i] = '\0'
return buf;
}
/*--- in main() ---*/
char buf[4096];
int r, n;
srandom(time(0));
scanf( "%d", &r );
init( r );
while ( scanf( "%d", &n ) > 0 )
printf( "%s\n", gen( n, buf ) );
00分享举报