首页 > 其他分享 >2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。 尝试N次,其中大于100的次数在A次~B次之间的概率是多少? 0 < P < 1, P是double类型,

2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。 尝试N次,其中大于100的次数在A次~B次之间的概率是多少? 0 < P < 1, P是double类型,

时间:2023-09-23 15:26:00浏览次数:68  
标签:概率 int double 随机数 ans 大于 100 dp

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

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

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

1 <= A <= B <= N <= 100。

来自左程云

答案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 <= N; i++ {
		dp[i] = make([]float64, N+1)
		for j := 0; j <= N; j++ {
			dp[i][j] = -1
		}
	}
	ans := 0.0
	for j := A; j <= B; j++ {
		ans += process(P, 1-P, N, j, dp)
	}
	return ans
}

func process(more, less float64, i, j int, dp [][]float64) float64 {
	if i < 0 || j < 0 || i < j {
		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<f64>> = 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<Vec<f64>>) -> f64 {
    if i < 0 || j < 0 || i < j {
        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 <iostream>
#include <vector>

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

double probability(double P, int N, int A, int B) {
    std::vector<std::vector<double>> dp(N + 1, std::vector<double>(N + 1, -1));
    double ans = 0;
    for (int j = A; j <= B; j++) {
        ans += process(P, 1 - P, N, j, dp);
    }
    return ans;
}

double process(double more, double less, int i, int j, std::vector<std::vector<double>>& dp) {
    if (i < 0 || j < 0 || i < j) {
        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 << probability(P, N, A, B) << std::endl;
    return 0;
}

在这里插入图片描述

c完整代码如下:

#include <stdio.h>
#include <stdlib.h>

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 <= N; i++) {
        dp[i] = (double*)malloc((N + 1) * sizeof(double));
    }

    for (int i = 0; i <= N; i++) {
        for (int j = 0; j <= N; j++) {
            dp[i][j] = -1;
        }
    }

    double ans = 0;
    for (int j = A; j <= B; j++) {
        ans += process(P, 1 - P, N, j, dp);
    }

    for (int i = 0; i <= N; i++) {
        free(dp[i]);
    }
    free(dp);

    return ans;
}

double process(double more, double less, int i, int j, double** dp) {
    if (i < 0 || j < 0 || i < j) {
        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;
}

在这里插入图片描述

标签:概率,int,double,随机数,ans,大于,100,dp
From: https://www.cnblogs.com/moonfdd/p/17724393.html

相关文章

  • 2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。 尝试N次,其
    2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。尝试N次,其中大于100的次数在A次~B次之间的概率是多少?0<P<1,P是double类型,1<=A<=B<=N<=100。来自左程云。答案2023-09-23:首先,我们可以使用动态规划来解决这个问题。我们可以定义一个二维数组d......
  • 【2023潇湘夜雨】WIN11_Pro_22H2.23545.1000软件选装纯净版9.23
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_23H2.23545.1000。2.增加部分优化方案,手工精简部分较多。3.OS版本号为23545.1000。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.13.0.8》网卡版、......
  • msvcr100.dll丢失怎么办?
    方法三:重新安装VisualC++2010RedistributablePackage只需要重新安装MicrosoftVisualC++2010RedistributablePackage即可。你可以从微软官方网站下载最新版本的安装包,然后按照提示进行安装。需要注意的是,这个方法只适用于已经安装了VisualC++2010的开发环境的用户。......
  • 上新!100%国产物料认证,米尔入门级国产核心板全志T113-i方案
    自米尔国产全志T113系列的核心板发布以来,这款高性价比、低成本、入门级、高性能的国产核心板咨询不断,配套的开发板已经成交量数百套,深受工程师们的青睐,为了集齐T113全系列的产品,这次米尔发布了基于全志T113-i处理器的核心板和开发板,让广大工程师有了更多的选择。接下来看看这款T113......
  • 上新!100%国产物料认证,米尔入门级国产核心板全志T113-i方案
    自米尔国产全志T113系列的核心板发布以来,这款高性价比、低成本、入门级、高性能的国产核心板咨询不断,配套的开发板已经成交量数百套,深受工程师们的青睐,为了集齐T113全系列的产品,这次米尔发布了基于全志T113-i处理器的核心板和开发板,让广大工程师有了更多的选择。接下来看看这款T11......
  • 如果有100万消息堆积在MQ , 如何解决 ?
    (1)消费者可以开启多线程消费,提高消费速率。(2)一个工作队列可以绑定多个消费者,同时消费消息。(3)扩大队列容积,提高堆积上限。比如集群搭建。(4)采用RabbitMQ惰性队列:①接收到消息后直接存入磁盘而非内存。②消费者要消费消息时才会从磁盘中读取并加载到内存。③支持数百万条的消息......
  • MySQL压缩包安装问题记录Can't connect to MySQL server on localhost (10061)解决方
    本文章向大家介绍MySQL问题记录--Can'tconnecttoMySQLserveronlocalhost(10061)解决方法,主要包括MySQL问题记录--Can'tconnecttoMySQLserveronlocalhost(10061)解决方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下......
  • 关于水质过滤的标准,除了100μm之外,还有以下过滤精度范围
    关于水质过滤的标准,除了100μm之外,还有以下过滤精度范围:微滤过滤,过滤精度约在1μm-0.1μm之间,能够过滤原水中的铁锈、泥沙、胶体、余氯等污染物。超滤过滤,过滤精度约在0.1μm-0.0005μm之间,能够过滤水中的细菌、病毒等微小污染物。反渗透高精度过滤,过滤精度约在0.001-0.0001μm......
  • 【230921-3】指数比较大小:5^100 vs 2^234
    ......
  • Mybatis大于、小于....转义写法
    描述转义前转义后大于>&gt;大于等于>=&gt;=小于<&lt;小于等于<=&lt;=和&&amp;单引号'&apos;双引号"&quot;......