关于随机数的几道算法题

温馨提示:这篇文章已超过764天没有更新,请注意相关的内容是否还可用!

主题:算法,随机数相关

目标:记录几道算法题的解法;刻意练习:无

目标读者:能读懂java的程序员

最近准备回炉重造一下,对计算机相关的内容进行学习和回顾。

基于教是最好的学,以及想要充分的折叠时间,接下来很长一段时间可能都会写纯技术向的内容。

人果然是会变的,这两年一直挣扎着想要摆脱程序员的身份,干点别的。兜兜转转一圈发现当程序员也挺好的。外加,当我没把这个职业做得足够好之前,好像也没啥资格说喜不喜欢的。

废话说了这么多,咱就直接开始吧。(另外,之后的技术向文章都会采用markdown格式来写,公众号貌似不支持这种格式吧,但也没关系,主要是这种格式比较方便迁移。)

今天的主题,关于算法,用java表达。学算法真是爽啊,大脑严重过载,感觉头发保不住了,哈哈哈。

# 随机数

## Math.random()

Math.random()方法的取值范围:(double)[0,1)

Math.random()方法可以保证每一个数都等概率出现。

也就是说对于任意一个x(取值范围内),生成的随机数出现在0~x之间的概率为x。

例:x=0.3,则随机数生成在0~0.3范围内的概率为0.3,即30%。

## 将0~x出现的概率由x改为x²

```java

public static double x2xPower2(){

return Math.max(Math.random(),Math.random());

}

```

即连续取两次随机数,需要两次都落在0~x之间,取最大值时才能取到。

例:

1.x=0.5,第一次取值为0.3,第二次取值为0.4,max=0.4,在0~0.5之间

2.x=0.5,第一次取值为0.3,第二次取值为0.7,max=0.7,不在0~0.5之间

1.x=0.5,第一次取值为0.7,第二次取值为0.8,max=0.8,不在0~0.5之间

所以,只有两次都在0~x之间,返回值才在0~x之间,所以概率由x变为了x\*x,即x²。

同理,如果改成x³,则再多取一次。

## 从1~5的随机到1~7的随机

有一个方法f1()可以生成1~5的随机数,现在需要利用这个方法来生成1~7的随机数。f1()方法只能用,不能改。

思路:

1.先讲f1()转换成等概率返回0~1的方法f2()

2.使用f2(),通过位运算来实现0~2^n的等概率产生方法

3.根据具体情况进行微调

1.如果得到1~2,返回0,如果得到4~5返回1,如果得到3,重新生成。通过二分法,实现0~1生成的等概率。

```java

public static int f2() {

int result;

do {

result = f1();

} while (result == 3);

return result < 3 ? 0 : 1;

}

```

2.2^3=8,所以可以利用3个二进制位来得到0~7的等概率生成,通过左移来实现。

```java

public static int f3() {

//(f2() << 2) + (f2() << 1) + (f2() << 0)

return (f2() << 2) + (f2() << 1) + f2();

}

```

3.1~7的随机生成,可以转化为0~6的随机生成加一。

第三步和第一步同理,生成0~6时返回,生成7时,重新生成。

```java

public static int f4() {

int result;

do {

result = f3();

} while (result == 7);

return result + 1;

}

```

## 从不等概率0和1到等概率

有一个方法f1()随机不等概率地生成0和1,要通过这个方法,生成等概率的0和1。f1()方法只能用,不能改。

思路:

假设生成1的概率为P,则生成0的概率为(1-P)

取两次值,会出现下面4种情况

11->P\*P

10->P\*(1-P)

01->(1-P)\*P

00->(1-P)\*(1-P)

所以,抛弃两次结果一样的情况,因为概率,我们不清楚。

但产生10或者01的概率是相同的。

```java

public static int f2() {

int result;

do {

result = f1();

} while (result == f1());

return result;

}

```

字数:不统计

耗时:1小时

··················END··················

九七分享吧所有文章来源于网络收集整理,如有侵权请联系QQ2387153712删除,如果这篇文章对你有帮助或者还不错的请给小编点个小赞(◠‿◠),小编每天整理文章不容易(ಥ_ಥ)!!!

文章版权声明:除非注明,否则均为九七分享吧原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

苹果 iOS/iPadOS 15.4.1 正式版发布

哎呦,被盗哦!周杰伦无聊猿NFT疑被钓鱼,价值超300万

“蔚小理”一季度成绩单:小鹏理想均跨过三万辆门槛,蔚来垫底

最完整的人类基因组序列,今天凌晨公布了!

手机行业不景气了?国产厂商大砍单:1.7亿订单取消

快手或将受益于互联网监管

我国实现首例V频段低轨卫星测控

北京外卖封签上线首日调查:1个封签约2分钱,已大面积推广

iPhone更换微信图标教程,安卓:不就是换个主题?

豆瓣关闭私密小组,壮士断腕为时未晚

台积电将5nm产量提高到15万片/月

京东增持京东物流 为了挽救股价还是应对激烈竞争?

发表评论

表情:
评论列表 (暂无评论,309人围观)

还没有评论,来说两句吧...

取消
微信二维码
微信二维码
支付宝二维码