1.有一个随机数发生器,可以产生1到5的随机数,利用这个随机发生器,怎样产生1到7的随机数
最直接的想法是拿随机数乘以7然后除以5,但这样产生的结果并不是等概率的,7*rand()/5中产生不了3和6,因而不可行
正确的做法是5*rand()+rand(),然后舍弃最后4个数,剩余21个数字。每三个数分为一组,分别产生1,2,3,4,5,6,7,这时产生的7个数字是等概率的。 5*rand()产生的数字范围是[0,25],rand()产生的数字范围是[1,5],5*rand()+rand()的范围是[6,30],这25个数字产生的概率均为1/25,三个数字分为一组,1,2,3,4,5,6,7产生的概率均为3/25。
Matlab程序如下:
a=[];
for j=1:1000
k=5*randi([1 5],1,1)+randi([1 5],1,1);
if (k>26)
continue;
else
a=[a floor(k/3-1)];
end
end
2.abc+cba=1333,分别求abc
a+c为13,a与c的取值组合为{4,9},{5,8},{6,7},{7,6},{8,5},{9,4}
代码如下:
# include <stdio.h>
int main()
{
for (int i=4;i<10;i++)
for (int j=0;j<10;j++)
if (101*13+20*j==1333)
printf("a is %d,b is %d,c is %d\n",i,j,13-i);
return 0;
}
3.有10瓶药,其中1瓶药品受到污染,未受污染的药品每粒1g,受到污染的重量1.1g,现有一个天平,只允许称一次,找出受污染的那瓶药
天平只能使用一次,解法可以是从#1瓶取1粒药,从#2瓶取2粒药,#3瓶取3粒药,…
如果#1瓶的药受污染,天平称出的重量是(1+2+3…+10)+1*0.1=55.1g,如果#2瓶的药受到污染,天平称出的重量是(1+2+3+4+…+10)+2*0.1=55.2g…
受到污染的瓶子是(重量-55)/0.1