编程珠玑笔记-第12章习题

本文探讨了随机数生成的方法,包括使用rand函数生成大范围随机数,随机选取指定区间内的多个元素及其概率分析,以及生成有序数并混合的技术。还涉及了递归算法在随机选择元素中的应用。

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

1 ,rand的返回值最大值是7fff

 使用位操作产生大的随机值

 

View Code
int bigRand()
{
    return rand()<<15&rand();
}
int rand(int l,int u)
{
    int k=(rand()%3)<<30&(rand()<<15)&rand();
    return l+k%(u-l+1);
}

2,随机选取0-n之间的一个i,取i,i+m-1共m个数,结果取模

3,m<n/2时,从n取一个数,在集合中的概率小于1/2,因此取值次数的期望是2

  这里题目的描述并不严谨

4,总共要取m次,集合的大小从0,1,2...m-1,次数的期望分别是n/n,n/(n-1),n/(n-2)...n/(n-m+1)

  当m=n时,和大概是nln(n)

7,第一问:添加一个最大值,输出时用最大值减一下,ps,如果m很大肯定会栈溢出

View Code
void randselect(int m,int n,int nMax)
{
    if(m>0)
    {
        if(rand()%n<m)
        {
            printf("%d\n",nMax-n+1);
            randselect(m-1,n-1,nMax);
        }else
        randselect(m,n-1,nMax);
         
    }
}

 第二问:每一个元素要么选要么不选,递归产生所有的情况

View Code
void randselect(int m,int n,vector<int> p)
{
    if(m>0)
    {
        if(n>m)
            randselect(m,n-1,p);
        p.push_back(n-1);
        randselect(m-1,n-1,p);         
         
    }else
    {
        for (int i=0;i<p.size();i++)
        {
            printf("%d ",p[i]);
        }
        printf("\n");
    }
}
int main()
{
    vector<int> t;
    randselect(2,10,t);
    system("pause");
    return 1;
}

8,产生有顺序的数,然后混合一下,书后答案是生成后就输出,这个答案比较靠谱..

   基于集合的算法可以使用比如multiset保存数

   直接生成m个数

9,使用Floyd的生成算法

  可以证明每个元素被选到的概率相等

10,这个题目是看明白了,答案看不明白,谷歌一下终于明白了

  答案的意思是说不断读取下一行,同时保存一个变量x指示当前应选择的行

  在第n行时有1/n的概率将x设为n

  可以用递归证明取每一行的概率都是1/n

11,其实就是3在12后面的概率,因为不用考虑其他元素,这个概率是1/3

12,话说我没找到它说的那个m=0就会崩溃的程序,知道作者指的是哪个程序,我觉的作者的意思是某个历史上的程序如何如何,我觉得这里翻译得不大好,有些歧义

   测试方法:可以生成大量数据进行统计

     

  

   

转载于:https://www.cnblogs.com/mightofcode/archive/2012/11/11/2765439.html

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值