java随机值函数,随机变量函数
这篇文章带给你一些关于java的知识,包括Java中随机函数的转换。本文中的样例代码讲解的很详细,对我们学习Java很有帮助。有兴趣的可以看看。
如何解决写爬虫IP受阻的问题?立即使用。
解决的问题
问题1
Java中的Math.random()函数以等概率返回区间[0,1]中的任意小数。也就是在x 1的情况下,[0,x]中的数的概率是x,如果我们想在x 1的情况下把[0,x]中的数的概率调整为x 2,应该怎么做?
1质疑想法
由于[0,x]的概率是x,所以调用Math.random()两次。如果较大的值也在[0,x]区间内,那么两次调用都必须在[0,x]区间内(因为[x,1]中的任何一个时间都会导致返回值不在[0,x]上),也就是说,概率为
包片段;
公共类代码_0004_RandToPow2 {
//将`[0,x)中数字的概率调整为` x ^ 2`。
公共静态double randToPow2() {
返回Math.max(Math.random()、math . random());
}
}我们可以通过下面的测试代码来验证问题1的解决方案:
包片段;
公共类代码_0004_RandToPow2 {
//将`[0,x)中数字的概率调整为` x ^ 2`。
公共静态double randToPow2() {
返回Math.max(Math.random()、math . random());
}
//测试用例
公共静态void main(String[] args) {
int count=0;
int testTimes=10000000
双x=0.17
for(int I=0;我测试时间;i ) {
if (randToPow2() x) {
数数;
}
}
system . out . println((double)count/(double)test times);
System.out.println(Math.pow(x,2));
}
}打印结果如下
接近目标要求。
问题2
假设我们有一个随机函数F(),它可以等概率返回[1,5]中的一个数。如何在不引入其他随机函数的情况下只利用f()函数,得到一个等概率返回[1,7]中任意数的函数G()。
思考
因为目标是找到[1,7]并等概率返回1,如果我们可以等概率处理一个返回[0,6]范围内任意数的X()函数,那么目标函数G()只需要调用这个X()函数加1,这就是G()函数的要求。
public static int g() {
返回x()1;
}要得到[0,6]的等概率,返回一个数,我们是需要先得到一个0和1等概率返回的随机函数m(),可以通过f()函数得到,即。
//随机函数f()以等概率[0,5]返回
//算出等概率得到0和1
//1,2,3,4,5五个数字
//当你得到1,2时,返回0
//当你得到4,5时,返回1
//当你得到3时,丢弃它,再试一次
public static int m() {
int ans=0;
做{
ans=f();
} while(ans==3);
还ans 3?0 : 1;
}利用等概率返回0和1的随机函数M(),我们可以很容易地生成[0,6]等概率随机返回一个数的方法。因为[0,6]需要三个二进制数,那么我们可以调用M()函数三次,等概率得到[0,7]范围内的任意数。我们可以在得到7时重试上述过程。
//等概率返回0~6
public static int x() {
int ans=0;
做{
ans=(m()2)(m()1)m();
} while(ans==7);
返回ans
}最后,目标函数f()如下
//等概率返回1~7
public static int g() {
返回x()1;
}你可以得到它。完整的代码如下
包片段;
公共类代码_0005_Rand5ToRand7 {
//这个函数只能使用,不能修改。
//等概率返回1~5
public static int f() {
return(int)(math . random()* 5)1;
}
//随机函数f()以等概率[0,5]返回
//算出等概率得到0和1
//1,2,3,4,5五个数字
//当你得到1,2时,返回0
//当你得到4,5时,返回1
//当你得到3时,丢弃它,再试一次
public static int m() {
int ans=0;
做{
ans=f();
} while(ans==3);
还ans 3?0 : 1;
}
//等概率返回0~6
public static int x() {
int ans=0;
做{
ans=(m()2)(m()1)m();
} while(ans==7);
返回ans
}
//等概率返回1~7
public static int g() {
返回x()1;
}
}
问题3
和问题2的思路一样。核心是要先实现一个等概率返回 0 和 1 的随机函数m()。。然后,看目标函数区间需要多少个二进制位来决定调用M()函数的次数。这里就不重复了。查看完整代码。
/**
*父类SolBase中已经定义了rand7() API。
* public int rand 7();
* @返回1到7之间的随机整数
*/
类解决方案扩展了SolBase {
public int rand10() {
返回兰特(10);
}
public int rand(int N) {
int位=1;
int base=2;
while (base=N) {
base=2位;
位;
}
int v=build(位);
while (v 1 v N) {
v=构建(位);
}
回归v;
}
私有int build(int bit) {
int v=0;
for(int I=0;我咬了;i ) {
v=(m()I);
}
回归v;
}
//核心:生成0和1概率相等的随机函数。
public int m() {
int I=rand 7();
while (i==7) {
I=rand 7();
}
return (i==1 i==2 i==3)?0 : 1;
}
}
问题4
有一个函数f(),以不等概率(但固定概率)返回0和1。如何仅通过f()函数得到一个等概率返回0和1的随机函数g(),
想法,
调用f()函数两次,可以得到如下结果
当两次都是0,或者两次都是1,放弃。虽然0和1的概率不同,但是
概率一定是一样的。
所以得到0 ^ 1就返回0,得到1 ^ 0就返回1,也就是G()函数。
完整的代码如下
包片段;
//不等概率随机函数变成等概率随机函数
公共类代码_0005_EqualProbabilityRandom {
//不等概率函数,
//内部内容不可见
public static int f() {
返回Math.random() 0.8?0 : 1;
}
//以相等的概率返回0和1
public static int g() {
int优先;
做{
first=f();//0 1
} while(first==f());
先退;
}
}推荐学习:以上《java视频教程》是Java中随机函数变换实例的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。