当前位置: 代码迷 >> C语言 >> [求助]求教一个简单的C问题
  详细解决方案

[求助]求教一个简单的C问题

热度:341   发布时间:2006-05-04 09:47:00.0
[求助]求教一个简单的C问题
本人是C新手,想请教各位高手一个简单的C程序问题.

比如:
Num_1=%d
Num_2=%d
Num_1=在区间[-10,10]均匀分布
Num_2=1/3概率 0
1/3概率 在区间[-10,-1]指数分布
1/3概率 在区间[1,10]指数分布
然后随机生成N次Num_1和Num_2

如何用C程序表达呢?

我想表达的意思是:

Num_1Num_2210进制的整数

Num_1的取值在区间[-1010]内,呈现均匀分布

Num_2的取值在区间[-1010]内,有3种情况

1/3概率 值为0

1/3概率 取值在区间[-10-1]内,呈现指数分布

1/3概率 取值在区间[110]内,呈现指数分布

然后随机生成NNum_1Num_2的有效取值.

我已经附加了指数分布的公式图片,请高人帮我分析一下啊!

请各位高人赐教,不胜感激.
谢谢了.
此主题相关图片如下:


上面那句话写错了吧?
不好意思,昨天说错了.今天又改了下,这次看您满意不?
Num_1=rand()%21-10;
Num_2=rand()%3?(rand()%2?(int)(exp(-rand()/B)/B)%10-10):(int)(exp(-rand()/B)/B)%10+1)):0;


----------------解决方案--------------------------------------------------------

非常感谢这位热心的soft_wind朋友给予的帮助,但是我有点疑问的就是如果使用?:的表达方式,不是很好推广到更一般性的情况.比如Num_2的取值落在更大区间的时候,比如1/5[...],1/5[...],...甚至1/N[]

我觉得这肯定是大家编写程序时候会遇到的情况,能否找出一个更有通性的表达方式呢?


----------------解决方案--------------------------------------------------------

我是准备这样写

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
int n1;
int n2;

int N;

N = 10; // N 次比如10次

/*初始化随机生成器*/
srand ( time(NULL) );


for (n1=N; n1>0; n1--) {

//NUM1
printf ("NUM1 - A number between -10 and 10: %d\n", rand()%21-10);

//NUM2
n2 = rand()%3;

switch (n2)
{
case 0:
printf ("NUM2 - 1/3 chance = 0: %d\n", 0);
break;

case 1:
// 这里空缺了,我不会写指数分布的表达式
printf ("NUM2 - 1/3 chance - A number between -10 and -1: %d\n", -10);
break;

default: // case 2:
// 指数分布的表达式
printf ("NUM2 - 1/3 chance - A number between 1 and 10: %d\n", 10);

}

}

return 0;
}

这样可以吗?

对于那个概率的问题,我还有点疑问,如果我增加两个表达式:

Num_2的取值有5种情况

1/5概率 值为0

1/5概率 取值在区间[-10,-1]内,呈现指数分布

1/5概率 取值在区间[1,10]内,呈现指数分布

1/5概率 取值在区间(-∞,-11]内,呈现均匀分布

1/5概率 取值在区间[10,+∞)内,呈现均匀分布

那么我应该如何表达呢?

[此贴子已经被作者于2006-5-4 20:26:40编辑过]


----------------解决方案--------------------------------------------------------
而且更重要的是我不会表达n个1/n以外的情况.比如:(3/7+1/2+1/14=1)的情况,我希望Num_2按照这个概率生成N次取值,那么该如何表达呢?
----------------解决方案--------------------------------------------------------
  相关解决方案