首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。 尝试N次,其中大于100的次数在A

2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。

尝试N次,其中大于100的次数在A次~B次之间的概率是多少?

0 < P < 1, P是double类型,

1

来自左程云。

答案2023-09-23:

首先,我们可以使用动态规划来解决这个问题。我们可以定义一个二维数组dp,其中dp[i][j]表示在i次尝试中,获得j次大于100的随机数的概率。

然后,我们可以使用递归的方式计算dp[i][j]。具体地说,我们可以将每一次尝试分为两种情况:获得大于100的随机数和获得小于等于100的随机数。如果我们获得大于100的随机数,则剩余的i-1次尝试中,我们需要获得j-1次大于100的随机数;如果我们获得小于等于100的随机数,则剩余的i-1次尝试中,我们还需要获得j次大于100的随机数。我们可以使用更大的P表示获得大于100的随机数的概率,用1-P表示获得小于等于100的随机数的概率。

递归的边界条件是如果i为0且j为0,则表示已经没有剩余的尝试次数,并且已经获得了所需的j次大于100的随机数,所以概率为1;如果i为0且j不为0,则表示已经没有剩余的尝试次数,但是还没有满足所需的j次大于100的随机数,所以概率为0。

为了避免重复计算,我们可以使用一个二维数组dp来保存计算过的结果。在每次计算前,先检查dp[i][j]是否已经计算过,如果是,则直接返回结果。

最后,在主函数中,我们可以调用probability函数来计算概率,并打印结果。

总的时间复杂度和额外空间复杂度分别为O(N^2),因为需要计算dp数组的所有元素。

go完整代码如下:

package?main

import?"fmt"

func?probability(P?float64,?N?int,?A?int,?B?int)?float64?{

dp?:=?make([][]float64,?N+1)

for?i?:=?0;?i?

dp[i]?=?make([]float64,?N+1)

for?j?:=?0;?j?

dp[i][j]?=?-1

}

}

ans?:=?0.0

for?j?:=?A;?j?

ans?+=?process(P,?1-P,?N,?j,?dp)

}

return?ans

}

func?process(more,?less?float64,?i,?j?int,?dp?[][]float64)?float64?{

if?i?

return?0

}

if?i?==?0?&&?j?==?0?{

return?1

}

if?dp[i][j]?!=?-1?{

return?dp[i][j]

}

ans?:=?more*process(more,?less,?i-1,?j-1,?dp)?+?less*process(more,?less,?i-1,?j,?dp)

dp[i][j]?=?ans

return?ans

}

func?main()?{

P?:=?0.6

N?:=?100

A?:=?30

B?:=?50

fmt.Println(probability(P,?N,?A,?B))

}

在这里插入图片描述rust完整代码如下:

fn?probability(p:?f64,?n:?i32,?a:?i32,?b:?i32)?->?f64?{

let?mut?dp:?Vec?=?vec![vec![-1.0;?(n?+?1)?as?usize];?(n?+?1)?as?usize];

let?mut?ans?=?0.0;

for?j?in?a..=b?{

ans?+=?process(p,?1.0?-?p,?n,?j,?&mut?dp);

}

ans

}

fn?process(more:?f64,?less:?f64,?i:?i32,?j:?i32,?dp:?&mut?Vec)?->?f64?{

if?i?

return?0.0;

}

if?i?==?0?&&?j?==?0?{

return?1.0;

}

if?dp[i?as?usize][j?as?usize]?!=?-1.0?{

return?dp[i?as?usize][j?as?usize];

}

let?ans?=?more?*?process(more,?less,?i?-?1,?j?-?1,?dp)?+?less?*?process(more,?less,?i?-?1,?j,?dp);

dp[i?as?usize][j?as?usize]?=?ans;

ans

}

fn?main()?{

let?p?=?0.6;

let?n?=?100;

let?a?=?30;

let?b?=?50;

println!("{}",?probability(p,?n,?a,?b));

}

在这里插入图片描述c++完整代码如下:

#include?

#include?

double?process(double?more,?double?less,?int?i,?int?j,?std::vector&?dp);

double?probability(double?P,?int?N,?int?A,?int?B)?{

std::vector?dp(N?+?1,?std::vector(N?+?1,?-1));

double?ans?=?0;

for?(int?j?=?A;?j?

ans?+=?process(P,?1?-?P,?N,?j,?dp);

}

return?ans;

}

double?process(double?more,?double?less,?int?i,?int?j,?std::vector&?dp)?{

if?(i?

return?0;

}

if?(i?==?0?&&?j?==?0)?{

return?1;

}

if?(dp[i][j]?!=?-1)?{

return?dp[i][j];

}

double?ans?=?more?*?process(more,?less,?i?-?1,?j?-?1,?dp)?+?less?*?process(more,?less,?i?-?1,?j,?dp);

dp[i][j]?=?ans;

return?ans;

}

int?main()?{

double?P?=?0.6;

int?N?=?100;

int?A?=?30;

int?B?=?50;

std::cout?

return?0;

}

在这里插入图片描述c完整代码如下:

#include?

#include?

double?probability(double?P,?int?N,?int?A,?int?B);

double?process(double?more,?double?less,?int?i,?int?j,?double**?dp);

double?probability(double?P,?int?N,?int?A,?int?B)?{

double**?dp?=?(double**)malloc((N?+?1)?*?sizeof(double*));

for?(int?i?=?0;?i?

dp[i]?=?(double*)malloc((N?+?1)?*?sizeof(double));

}

for?(int?i?=?0;?i?

for?(int?j?=?0;?j?

dp[i][j]?=?-1;

}

}

double?ans?=?0;

for?(int?j?=?A;?j?

ans?+=?process(P,?1?-?P,?N,?j,?dp);

}

for?(int?i?=?0;?i?

free(dp[i]);

}

free(dp);

return?ans;

}

double?process(double?more,?double?less,?int?i,?int?j,?double**?dp)?{

if?(i?

return?0;

}

if?(i?==?0?&&?j?==?0)?{

return?1;

}

if?(dp[i][j]?!=?-1)?{

return?dp[i][j];

}

double?ans?=?more?*?process(more,?less,?i?-?1,?j?-?1,?dp)?+?less?*?process(more,?less,?i?-?1,?j,?dp);

dp[i][j]?=?ans;

return?ans;

}

int?main()?{

double?P?=?0.6;

int?N?=?100;

int?A?=?30;

int?B?=?50;

printf("%f\n",?probability(P,?N,?A,?B));

return?0;

}

在这里插入图片描述

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OlrMHWk0yRwlyMYbL4L7aiKA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com