新手班知识点整理第二节

文章介绍了如何在C++中使用前缀和方法快速计算数组区间和,并通过随机数生成函数实现从一个固定范围到另一个随机范围的转换,包括不等概率和等概率的随机数生成。
摘要由CSDN通过智能技术生成

1 前缀和的应用:快速求范围内的和

#include<vector>
using namespace std;
class rangesum1//普通的数组区间求和 
{
	private:
	vector<int> arr;
	public:
	rangesum1(const vector<int> &array):arr(array) {}
	int rangesum(int L,int R)
	{
		int sum=0;
		for(int i=L; i<=R;i++)
		{
			sum+=arr[i];
		}
		return sum;
	} 
};
class rangesum2//前缀和方法 
{
	private:
	vector<int> presum;
	public:
	rangesum2(const vector<int> &array)//生成前缀和数组 
	{
	  int N=array.size();
	  presum.resize(N);
	  presum[0]=array[0];
	  for(int i=1;i<N;i++)
	  {
	  	presum[i]=presum[i-1]+array[i];
	  } 
	}
	int rangesum(int L,int R)
	{
		return L==0?presum[R]:presum[R]-presum[L-1];
	}
};

2一个随机的数到另一个随机的数

#include<bits/stdc++.h>
int f()
{
	srand(0);
	return rand()%5+1;
	//黑盒产生一个等概率1到5的随机数,该黑盒不能修改 
}
int a()//先把黑盒内部的数范围转到0到1
//方法:将1 2 3 4 5分为两部分,当是3的时候继续跑,1 2时候是0,4 5时候是1 
{
	int ans=0;
	do
	{
		ans=f();
	 }while(ans==3);
	 return ans<3?0:1; 
}
int b()
//把0到1范围转到0到6范围,0 1组成的三位二进制数最大为111(7) 
{
	int ans=0;
	do
	{
		ans=(a()<<2)+(a()<<1)+a();
	}while(ans==7)//最大范围只能到6 
	return ans; 
}
int c()//等概率返回1到7
{
	return b()+1; 
}
#include<bits/stdc++.h>
int x()//不等概率0到1 
{
	srand(0);
	return rand()<0.8?1:0;
}
int y()//等概率0到1 
{
	int ans=0;
	do
	{
		ans=x();
	}while(ans==x());
	return ans;
}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值