2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P服务器托管网。
尝试N次,其中大于100的次数在A次~B次之间的概率是多少?
0
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
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
c++完整代码如下:
#include
#include
double process(double more, double less, int i, int j, std::vector>& dp);
double probab服务器托管网ility(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 >& dp) {
if (i
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
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 💬文章目录 一.模板的基础知识 ①为什么有模板? ②初识模板 二.函数模板 ①函数模板的定义 ②函数模板的使用 ③函数模板实例化 1️⃣隐式实例化 2️⃣显示实例化 ④函数模板的具体化(特化…