import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class RandNFromRand5 {
/**
题目:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。
解法1:
f(k) = (x0-1)*5^0+(x1-1)*5^1+(x2-1)*5^2+(x3-1)*5^3+…+(Xk-1-1)*5^(k-1)
f(k)是一个随机数,一个5进制的随机数,取值范围U=[0,(5^k)-1],这里考虑将U等分成7等分
(能否达到等分?只要k足够大,误差就可以足够小),那么每次产生的数位于哪个等分里,参生的随机数就为几。
解法2:
只要我们可以从 n 个数中随机选出 1 到 n 个数,反复进行这种运算,直到剩下最后一个数即可。
我们可以调用 n 次给定函数,生成 n 个 1 到 5 之间的随机数,选取最大数所在位置即可满足以上要求。
例如
初始的 7 个数 [1,2,3,4,5,6,7].
7 个 1 到 5 的随机数 [5, 3,1,4,2,5,5]
那么我们保留下[1,6,7],
3 个1 到 5 的随机数[2,4,1]
那么我们保留下[6]
6 就是我们这次生成的随机数。
*/
public static void main(String[] args) {
RandNFromRand5 r=new RandNFromRand5();
for(int i=0;i<100;i++){
int result1=r.nextInt(7);
int result2=r.rand7();
System.out.println(result1+","+result2);
}
}
/*solution 1:
*return 1~n randomly.Now we assume n=7
*/
public int nextInt(int n){
if(n<=5){
return -1;
}
int result=0;
int k=0;
int max=1;
while(max<n){//now max=25,k=2
max*=5;
k++;
}
int item=0;
int range=(max/n)*n;//range=21,so 21~25 are eliminated.
boolean done=false;
while(!done){
for(int i=0;i<k;i++){
int x=rand5()-1;
//item+=x*(5^i),,"very wrong"! "^" means "xor"!
item=item*5+x;
}
if(item<range){
done=true;
}else{
item=0;
}
}
int mode=max/n;//mode=3,there are 3 items in each part,like (0,1,2)->1,(1,2,3)->2...(18,19,20)->7
result=(item/mode)+1;
return result;
}
/* solution 2:
* return 1~7 randomly
*/
public int rand7(){
List<Integer> list=new ArrayList<Integer>();
for(int i=1;i<=7;i++){
list.add(i);
}
return rand7Help(list);
}
public int rand7Help(List<Integer> list){
if(list==null || list.size()==0){
return -1;
}
if(list.size()==1){
return list.get(0);
}
int n=list.size();
int[] nRand5=new int[n];
int max=0;
for(int i=0;i<n;i++){
int x=rand5();
if(x>max){
max=x;
}
nRand5[i]=x;
}
List<Integer> newList=new ArrayList<Integer>();
for(int i=0;i<n;i++){
if(nRand5[i]==max){
newList.add(list.get(i));
}
}
return rand7Help(newList);
}
public int rand5(){
return new Random().nextInt(5)+1;
}
}
分享到:
相关推荐
最近学习Numpy,根据作业要求写了个简单的代码,用Numpy内置函数随机生成均匀分布(0,1)的10个数据,并输出离一个给定值最近的数。
给定程序中,函数fun的功能是:在任意给定的9个正整数中找出按升序排列是处于中间的数,将原数据序列中比该中间数小的数用该中间数替换,位置不变,在主函数中输出处理后的数据序列,并将中间数作为函数值返回。...
以下两个函数分别是生成一个最大范围内随机整数,和生成一个区间范围的随机整数: 生成一个最大范围内随机数 一定要给一个时间戳的种子,否则每次生成都是一样的值。这里就是生成 [0,100) 的随机数。 func ...
C语言程序设计-求给定正整数m以内的素数之和;例如:当m=20时,函数值为77;
最大间隙问题 ...输入数据的第1 行有1 个正整数n。接下来的1 行中有n个实数x1, x2,... , xn。 Output 程序运行结束时,将找到的最大间隙输出。 Sample Input 5 2.3 3.1 7.5 1.5 6.3 Sample Output 3.2
如果一个函数的图象关于原点对称,那么这个函 数是奇函数。 如果一个函数的图象关于y轴对称, 那么这个函 数是偶函数。
}/* 你的代码将被嵌在这里 */输入样例:3输出样例:1236-2 多项式求值(15 分)本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]
若是同构数,函数返回1;否则返回0;x的值由主函数从键盘读入,要求不大于100;说明:所谓“同构数”是指这样的数,这个数出现在它的平方数的右边;例如:输入整数5,5的平方数是25,5是25中右侧的数,所以5是同构数;
Shashi ,一个简单的模块,使用伪随机性生成一个通用系列/散列函数集,它产生选定范围内的整数值(质数)。 ###一个随机的理论 如果对于宇宙中的任意两个项目,碰撞的概率尽可能小,则哈希函数族H是通用的。 ...
1.建立一个顺序表,随机产生10个100以内的整数,并按要求完成:(1)编写显示函数,在屏幕上显示顺序表中的10个整数; (2)编写查找函数,从键盘输入任-一-整数在顺序表中查找,若找到,返回该元素在顺序表中的位置,...
pmfRND 输出给定 PMF 的随机整数 x = pmfRND(f,X) 返回 mxn 矩阵,其值是 Zipf 分布的, 其中f> 0是PMF(离散PDF),使得sum(f)= 1; X = [m,n]是期望的输出随机矩阵的大小。
给定一个单调递增的整数序列,问某个整数是否在序列中
设x为整数,输入x的值,请输出y相应的值(分段函数)。 2*x+6 (x>0) y= 0 (x=0) 2*x-6 (x) (提示:用if语句编写)
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
对于给定的一组整数和散列函数,分别采用线性探测法和拉链法处理冲突构造散列表,并在这两种方法构建的散列表中查找整数K,比较两种方法的时间和空间性能。
该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。 0-1 背包问题描述如下:给定n 种物品和一个背包。物品i的重量是wi,其价值为vi ,背包的容量为C。应如何选择装入背包的...
当月份为1、3、5、7、8、10、12时,日在1~31之间;月份为4、6、9、11时,日在1~30之间;月份为2时,若年为闰年,日在1~29之间,不为闰年在1~28之间。 闰年:year%4==0&&year0;!=0||year@0==0 2.计算两个日期相差的...
...,且仅能被1和自己整除的整数...
用matlab的函数文件makeGDSum.m,实现了构造N个随机数的总和为某个值 ,其他m文件可以调用该函数;makeGDSum2.m构造N个随机数的总和为某个值 附加一些条件
20063 求1-2/3+3/5-4/7+5/9-6/11+…… 14 20064 求2^1+2^2+2^3+……+2^n 15 第4周(M4) 15 10007 显示图案 (复习printf()的字符串输出) 15 20042 生成阶乘表 16 20043 使用函数求 n! /(m!* (n-m)!) 16 ...