今天在网上看到了在网上传的面试题,题目是:
已知有个rand7()的函数,它可以返回1到7之间的随机自然数,现在请让利用这个rand7()来构造rand10()使它能 随机地产生1~10之间的自然数。
参考以下网址,我觉得写的不错。好像这是道编程之美上的题?
http://www.towork.me/questions/451/
对于这一类题目的一般公式是: m*(rand_m()-1)+rand_m();n<m && n<=m*m
注: rand_m() 可以生成 [1,m]的自然数, 要生成 rand_n() 即[1,n]的自然数的公式。
其实,这个问题,其实就是,我先生成等间距的一段数(间距一定是m),这个数分别为 0, m, 2m, 3m,..., (m-1)*m, m*m。 在 rand_m()中进行-1, 就是能够产生0。注意这个间距相当于是等概率产生的,那么,我在先定了一个起点,在这个起点的基础上,再加上一个数值,就可以了。(所以,这个地方就要求,间距必须是m, 这样通过rand_m 才能覆盖两个间距的所有的数,同时对于生成的起点,也是只有一种可能)
就如同,本题目,按照这个公式,我们就可以等概率地生成1~49间的所有数了。(7*6+7, 最大范围),那如何生成1--10呢。其实,等概率地生成1~49, 就可以等概率地生成1~10,我们最简单的方法,可以直接判断这个结果是否在1~10之间就可以,如果不在,就重新再试一次。但是这样速度可能比较慢。所以我们可以在1~m*m 中,挑选几组 1~10,也就是可以是 1~10,11~20, 。。。,这样就可以更快地得到我们的结果。
所以我觉得下面这个程序写的不错,就是上面链接中的程序。
int random_n()
{
int val = 0 ;
int t; // t为n最大倍数,且满足 t <= m * m
do {
val = m * (random_m() - 1) + random_m();
} while (val > t);
return val;
}
可以略微对val处理一下。
2012-03-01
方法2:
例如Rand7会生成1,2,3,4,5,6,7这些数。我们以4为分界点。
如果生成1-3这3个数字时,我们在Rand7,只取1-5这几个数字。
如果生成5-7这3个数字时,我们在Rand7+3,只取5-10这几个数字。
方法3:
例如Rand7会生成1,2,3,4,5,6,7这些数。我们以4为分界点。
由于 rand7 是 1..7
rand7+3是 4..10, 直接返回结果时,4..7 的概率会多一倍
全局标志位 flag = 0; 记录每当出现再次4..7时才进行输出
1.如果生成1-3这3个数字时,我们在Rand7
1.1如果生成1-3,直接输出
1.2如果生成4-7,如果flag=0, 则置flag = 1, 再调用一次Rand10.
flag = 1, 直接返回此值, flag = 0
2.如果生成5-7这3个数字时,我们在Rand7+3,只取5-10这几个数字。
同理
分享到:
相关推荐
基于Zipf分布生成随机数作者:Tuyen Tran (tuyen.tran@rutgers.edu)。 2015 年 10 月参考: ... N 元素数expn 指数M 要生成的样本数(在 [1,N] 范围内) 示例:zipf_rand(3,1,4) 答案 = 3 2 1 1
输入: (N,M) = 要生成的随机变量数组的大小b = 比例参数 > 0 c = 形状参数 > 0 概率密度函数 (pdf) p(x) = (x/b)^(c-1) * exp(-x/b) / (b * gamma(c)) 其中 gamma(c) 是 gamma 函数( ...
rand_extended 计算区间 [a,b] 中的随机数它基本上是命令 rand 的扩展版本输入: a:区间的下界b:区间的上界m,n(可选):随机数矩阵的维度生成输出: M:区间[a,b]中的随机数/矩阵
它将 random_unit_vector 的结果与简单的generearion 进行比较: v= 2*rand(2,1)-1; n=v/sqrt(v(1)^2+v(2)^2) 这种简单的遗传方法有一个缺点:它是各向异性的。 在 2d 中,它的角度分布最大值为 45 135 225 315 度...
X = rand2(a,b) X = rand2(a,b,[],typename) X = rand2(a,b,[m,n]) X = rand2(a,b,[m,n],typename) 描述 X = rand2(a,b)返回一个随机的双精度浮点数,介于 和 。 X = rand2(a,b,[],typename)返回一个随机数的...
该文件中包含了多种随机数的产生,其中的zipf分布是自己所写,很不错的一个m文件。
1.3、rand(m,n):产生范围为0-1的mxn随机数矩阵 1.4、rand(size(A)):产生范围为0-1,且行列数与A矩阵相同的随机数矩阵。 II.randn用法 2.1、randn:随机的数,服从标准正态分布。 标准正态分布图 2 2、...
%n表示问题的规模(城市个数) D=zeros(n,n);%D表示完全图的赋权邻接矩阵 for i=1:n for j=1:n if i~=j D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5; else D(i,j)=eps; %i=j时不计算,应该为0,但后面...
R = floor(10*rand(m,n)) %生成随机矩阵 % Row_min = 0; % Column_min = 0; for i_m=1:1:m %寻找每一行元素和的最小值 Row_min(1,1) = Row_min(1,1)+min(R(i_m,:)); end fprintf('每一行元素和的最小值%g\n',Row_...
此函数生成指定长度的随机整数行向量,其中每个元素受下限和上限的限制,同时加起来为... % m - 指定的目标总和% n - 所需行向量的长度(即元素数) % ul - 所需向量中允许的值的上限% ll - 所需向量中允许的值的下限
tao(route(c_index1_t(NC,i),n-1),g(NC,c_index1_t(NC,i)))=(1-rou).* tao(route(c_index1_t(NC,i),n-1),g(NC,c_index1_t(NC,i)))+rou*detatao(route(c_index1_t(NC,i),n-1),g(NC,c_index1_t(NC,i))); tao(g(NC,c_...
matlab数组赋值调用函数生成特殊矩阵 ...生成m行n列的随机矩阵, 矩阵中的每个元素都是0到1之间的随机数, 而且随机数满足均匀分布 randn(m,n) 生成m行n列的随机矩阵, 矩阵中每个元素都是标准正态分布的
global m n NewPop children1 children2 VarNum bounds=[LB;UB]';bits=[];VarNum=size(bounds,1); precision=options(2);%由求解精度确定二进制编码长度 bits=ceil(log2((bounds(:,2)-bounds(:,1))' ./ precision))...
randone1 - 生成一个随机数组,每行和每列一个 1 randone1(N) 返回一个 N×N 方阵,其中有 0 个和 N 个 1, 随机分布,使得每一行和每一列都包含一个 1。 randone1(N,M) 其中 M > N 返回一个 N×M 数组,其中包含零...
//by史瑞 #include<stdlib.h>//srand()、rand() #include<time.h>//time(); #include #include swap(unsigned char *pm,... //printf("\n产生范围在0到255的随机数 \n"); srand( (unsigned char)time( NULL ) );
该文件生成一个包含“n”个随机数(0 和 1)的向量,其中包含二项分布。 参数 'p' 是与得到 [P(x=1) = p] 相关的概率。 对于“x”小数值,文件会自动将其四舍五入到最接近的整数。 如果在“p”输入和'p'-输出值...
matlab代码牛顿迭代OptM ...要运行代码,请首先从()下载qaplib,然后运行GenQAPLIB.m以生成matlab格式的数据矩阵。 这些求解器已经解决了应用程序: 具有多个球形约束的齐次多项式优化问题:$$ \ max; \ sum_ {1
R=rand(1,1);%生成一个元素在0,1之间均匀分布的随机矩阵R B(I,J)=A(I,J)*sin(R*2*pi);%平滑函数的傅里叶变换谱 A(I,J)=A(I,J)*cos(R*2*pi); F(I,J)=A(I,J)+j*B(I,J); end End%限制振幅的动态范围,提高编码的...
输入你要求的密钥位数,然后用rand()函数生成一个个32位数,拼接成大数,进行素性检测,是素数就返回,就这样就产生了公钥(e,n)和私钥(d,n),然后利用 公式c=m^e mod n,得到密文,保存得到的密文到文本文档,再用...
指令的地址按下述原则生成;(2)将指令序列变换为页地址流(3)计算先进先出(FIFO)算法或最近最少使用(LRU)算法在不同内存容量下的命中率。 其中,命中率=1-页面失效次数/页地址流长度 C编译的源代码