470. 用 Rand7() 实现 Rand10() (拒绝采样+进制转换)

在这里插入图片描述

解法:拒绝采样 + 进制转换

思路:在拒绝采样中,如果生成的随机数满足要求,那么就返回该随机数,否则会不断生成,直到生成一个满足要求的随机数为止。
我们只需要能够满足等概率的生成 10个不同的数即可,具体的生成方法可以有很多种。
自古评论区出人才:
通过两次独立的随机过程,生成两个随机数a和b,将其看做两个7进制数,它们一共可以表示0~48范围内的数,这49个数中每个数的生成概率都是相等的,取前10个就可以满足要求。

// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7

int rand10() {
    int ret;
    for(;;)
    {
        // a和b独立
        int a = rand7()-1;
        int b = rand7()-1;
        // 两位7进制数ab,转10进制
        ret = a*7+b; 
        // 只取前10个数
        if(ret < 10 ) break;
    }
    ret = ret + 1;
    return ret;
}

进阶:怎么少调用rand7()?
现在只有 10 49 \frac{10}{49} 4910的概率生成我们需要的数,现在想办法让更多的数被我们用到。
可以取前40个数。就有 40 49 \frac{40}{49} 4940的概率能产生符合要求的随机数。

// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7

int rand10() {
    int ret;
    for(;;)
    {
        // a和b独立
        int a = rand7()-1;
        int b = rand7()-1;
        // 两位7进制数ab,转10进制
        ret = a*7+b; 
        // 只取前40个数
        if(ret < 40 ) break;
    }
    ret = ret/4 + 1;
    return ret;
}

rand7()调用次数的期望值?
调用两次rand7(),成功的概率是 40 49 \frac{40}{49} 4940。rand7()调用次数的期望:
1 40 49 ∗ 2 = 2.45 \frac{1}{\frac{40}{49}}*2=2.45 494012=2.45

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 生成二随机序列 可以使用 `rand` 函数生成 0 到 1 之间的随机数,并根据设定的概率将其转换成 0 或 1,最终得到一个长度为 1000 的二随机序列。 ```matlab p0 = 0.7; % “0”的概率 p1 = 0.3; % “1”的概率 n = 1000; % 序列长度 % 生成随机序列 seq = rand(1, n); seq(seq < p0) = 0; seq(seq >= p0) = 1; disp(seq); % 显示生成的随机序列 ``` 2. 归零 AMI 编码 根据 AMI 编码规则,每当输入为 1 时,输出为正或负的脉冲,脉冲宽度为符号宽度的一半。为了方便起见,这里将符号宽度设置为 1。 ```matlab T = 0.5; % 符号宽度 t = linspace(0, n, n*8); % 波形采样时间 p = zeros(1, length(t)); % 初始化脉冲序列 polarity = 1; % 初始极性为正 for i = 1:n if seq(i) == 0 p((i-1)*8+1:i*8) = 0; else p((i-1)*8+1:i*8) = polarity; polarity = -polarity; % 取反 end end % 绘波形 plot(t, p); ylim([-1.5 1.5]); xlabel('Time'); ylabel('Amplitude'); title('AMI Code'); ``` 3. 功率谱估计 可以使用 `pwelch` 函数对归零 AMI 编码后的波形行功率谱估计。 ```matlab % 计算功率谱密度 fs = 8/T; % 采样率 [P, f] = pwelch(p, [], [], [], fs); % 绘功率谱密度图 plot(f, 10*log10(P)); xlabel('Frequency'); ylabel('Power Spectral Density (dB/Hz)'); title('Power Spectral Density of AMI Code'); ylim([-60 10]); ``` 4. 改变信源“0”的概率 我们可以尝试改变随机序列中“0”的概率,观察 AMI 编码的功率谱变化情况。 ```matlab p0 = 0.9; % “0”的概率 p1 = 0.1; % “1”的概率 % 生成随机序列 seq = rand(1, n); seq(seq < p0) = 0; seq(seq >= p0) = 1; % 归零 AMI 编码 p = zeros(1, length(t)); polarity = 1; for i = 1:n if seq(i) == 0 p((i-1)*8+1:i*8) = 0; else p((i-1)*8+1:i*8) = polarity; polarity = -polarity; end end % 计算功率谱密度 [P, f] = pwelch(p, [], [], [], fs); % 绘功率谱密度图 figure; plot(f, 10*log10(P)); xlabel('Frequency'); ylabel('Power Spectral Density (dB/Hz)'); title('Power Spectral Density of AMI Code'); ylim([-60 10]); ``` 通过改变“0”的概率,我们可以观察到 AMI 编码的功率谱密度图的变化情况。当“0”的概率越大时,功率谱密度图中的低频成分越明显,而当“0”的概率越小时,功率谱密度图中的高频成分越明显。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值