编程珠玑:取样问题

本文介绍了三种从0至n-1范围内选取m个随机数的有效方法:按序选择、集合填充与数组打乱,每种方法都有其特点及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章问题:取样问题,主要讲述一个从0~n-1范围内选择m个随机数(有序的)

方法一:依次考虑0,1,…,n-1之间的每个整数,并通过一个适当的随机测试对每个整数进行选择,一般来说,要从r个剩余的整数中选择s个,那么选择下一个整数的概率为s/r。

//在0~n-1范围内按序随机选择m个整数

RadnomSelect(m,n):

 select=m

 remaining=n

  fori=[0,n)

    if (bigrand()%remaining)<select //bigrand()返回一个较大的随机数

           print i

           select--

        remaining—

该方法的时间复杂度为O(n)。

方法二:在一个初始为空的集合(不含重复元素)中插入随机整数,直到个数足够。

        while size<m do

       t=bigrand()%n

              ift is not in S

                 insert t into S

                 size++

        print the elements of S in sorted order

这里的数据结构S要求可以保证整数有序,不存在重复元素。可以利用C++标准模板库中set表示集合,set底层采用红黑树实现,是一种较平衡的二叉查找树。用C++语言编写的函数如下:

        void gensets(int m,int n)

        {

               set<int> S;

               while(S.size()<m)

               {

                      s.insert(bigrand()%n);

               }

               set<int>::iterator it;

               for(it=S.begin();it!=S.end();++it)

                      cout<<*it<<'\n';

        }

方法三:

把0~n-1范围内的整型数组顺序打乱,然后把前m个整数排序输出。

改进:只需打乱数组的前m个元素,然后将前m个整数排序输出。C++代码如下:

void genshuf(int m,int n)

        {

               int i,j;

               int *x=new int[n];

               for(i=0;i<n;++i)

                      x[i]=i;

               for(i=0;i<m;++i)

               {

                      j=randint(i,n-1);//生成i~n-1范围内的一个随机数

                      intt=x[i];

                      x[i]=x[j];

                      x[j]=t];

               }

 

               sort(x,x+m);

               for(i=0;i<m;++i)

                      cout<<x[i]<<"\n";

        }

 

 

编程过程的几个重要步骤:

1、 正确理解所遇到的问题。

2、 提炼出抽象的问题。简洁、明确的问题陈述不仅可以帮助我们解决当前遇到的问题,还有助于我们把解决方案应用到其他问题中。

3、 考虑尽可能多的解法。多思考一些可能的解决方案,寻找较优的方法,不仅可以提升程序的效率,还可能会缩短编写代码的时间。

4、 实现一种解决方案。用简单的代码和最有效的操作来实现最终选取的解决方案。

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值