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类型,
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;
}

2023-09-23:用go语言,假设每一次获得随机数的时候,这个数字大于100的概率是P。 尝试N次,其中大于100的次数在A次~B次之间的概率是多少? 0 < P < 1, P是double类型,的更多相关文章
- 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?
题目:给定一个函数rand()能产生1到n之间的等概率随机数,问如何产生1到m之间等概率的随机数? 先把问题特殊化,例如原题变为给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一 ...
- 面试题:给定一个函数rand()能产生1到m之间的等概率随机数,产生1到n之间等概率的随机数?
虽然TX的面试已经过去好几天了,然而惨痛的过程还历历在目.人生中第一次正式job面试就这么挂掉了.在于面试官的交流过程中,被问及了几个算法设计题,在今后几篇博文中,我一一总结与诸君分享. 1. 给定一 ...
- 总结 Date 2017.09.23
总结 Date 2017.09.23 <1>统计数字 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计 ...
- 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)
2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...
- LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 前天刚举办 2023 年力扣杯个人 SOLO 赛,昨天周赛就出了一场 Easy - Ea ...
- c语言中实现从0-1的随机数输出
原文:c语言中实现从0-1的随机数输出 今天晚上同学问了一个巨简单的问题,问我怎么用c语言输出0-1的随机数,可别说,一时之间还想不出来.在写的过程中发现,直接调用random函数还不能实现,用以下方 ...
- C语言产生标准正态分布或高斯分布随机数
C语言 产生标准正态分布或高斯分布 随机数 产生正态分布或高斯分布的三种方法: 1. 运用中心极限定理(大数定理) #include #include #define NSUM 25 double g ...
- 设计一个网上书店,该系统中所有的计算机类图书(ComputerBook)每本都有10%的折扣,所有的语言类图书(LanguageBook)每本都有2元的折扣,小说类图书(NovelBook)每100元
现使用策略模式来设计该系统,绘制类图并编程实现 UML类图 书籍 package com.zheng; public class Book { private double price;// 价格 p ...
- C#3.0新增功能09 LINQ 基础01 语言集成查询
连载目录 [已更新最新开发文章,点击查看详细] 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称. 数据查询历来都表示为简单的字符串,没有编译时类型检查或 Inte ...
- [idea]idea配置Jrebel 标签: ideatomcatjrebel 2017-03-14 09:23 547人阅读 评论(21
上篇博客讲了如何为idea设置tomcat,这篇博客要给大家推荐Jrebel,其实eclipse上也可以配置Jrebel,但是在使用eclipse的时候并没有发现这些东西,还是习惯使然,对一个比较熟悉 ...
随机推荐
- shell学习总结
shell教程 第一个shell脚本 打开文本编辑器(可以使用 vi/vim 命令来创建文件), 新建一个文件 test.sh,扩展名为 sh(sh代表shell) #!/bin/bash echo ...
- Java中读取用户输入的是谁?Scanner类
前言 我们在初学 Java 编程的时候,总是感觉很枯燥乏味,想着做点可以交互的小系统,可以让用户自由输入,系统可以接收做出反映.这就要介绍一下 Java 中的 Scanner 类了. 一.Scanne ...
- @SafeVarargs注解的使用
在声明具有模糊类型(比如:泛型)的可变参数的构造函数或方法时,Java编译器会报unchecked警告.鉴于这些情况,如果程序员断定声明的构造函数和方法的主体不会对其varargs参数执行潜在的不安全 ...
- Linux多线程(8.3 线程同步与互斥)
3. 线程的同步与互斥 为什么需要同步与互斥 一个进程运行时,数据存储在内存中.如果一个数据要进行运算,必须先将数据拷贝到寄存器中.比如要对栈上的一个int i进行"++"操作 ...
- 数据库varchar和tinyint和int和java实体属性的对应关系的学习
大家好,最近做项目碰到群里小伙伴的对于项目中用到的这几个类型,自己的java实体类属性该用什么类型干到困惑,于是乎,我决定为大家解密! 相信我,绝对干货,看完了,工资+200~哈哈哈,扯远了,闲话不对 ...
- 简约版八股文(day1)
Java基础 面向对象的三大基本特征 封装:将一些数据和对这些数据的操作封装在一起,形成一个独立的实体.隐藏内部的操作细节,并向外提供一些接口,来暴露对象的功能. 继承:继承是指子类继承父类,子类获得 ...
- Unity的OnOpenAsset:深入解析与实用案例
Unity OnOpenAsset 在Unity中,OnOpenAsset是一个非常有用的回调函数,它可以在用户双击资源文件时自动打开一个编辑器窗口.这个回调函数可以用于自定义资源编辑,提高工作效率. ...
- 如何使用Java在Excel中实现一个数据透视表
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前一段时间淘宝出了一个"淘宝人生"的模块, ...
- 在行情一般的情况下,就说说23级应届生如何找java工作
Java应届生找工作,不能单靠背面试题,更不能在简历中堆砌和找工作关系不大的校园实践经历,而是更要在面试中能证明自己的java相关商业项目经验.其实不少应届生Java求职者不是说没真实Java项目经验 ...
- Failed to connect to 127.0.0.1 port 1080: Connection refused拒绝连接错误
一.git拒绝连接原因分析 使用git从远程仓库下载代码出现上述的错误是因为使用了proxy代理,所以要解决该问题,核心操作就是要取消代理 二.解决方式 1.查看Linux当前有没有使用代理 通过gi ...