Day4 | 拒绝采样

470 用rand7()实现rand10()

我们可以用拒绝采样的方法实现 \textit{Rand10()}Rand10()。在拒绝采样中,如果生成的随机数满足要求,那么就返回该随机数,否则会不断生成,直到生成一个满足要求的随机数为止。

我们只需要能够满足等概率的生成 1010 个不同的数即可,具体的生成方法可以有很多种,比如我们可以利用两个 \textit{Rand7()}Rand7() 相乘,我们只取其中等概率的 1010 个不同的数的组合即可,当然还有许多其他不同的解法,可以利用各种运算和函数的组合等方式来实现。

class Solution extends SolBase {
    public int rand10() {
        int row, col, idx;
        do {
            row = rand7();
            col = rand7();
            idx = col + (row - 1) * 7; //减1 是为了只生成1~40的数
        } while (idx > 40);
        return 1 + (idx - 1) % 10;
    }
}

正则表达式

基本元素

1. 普通字符: 除 *, ? , \, (, ), [, ], -, . , +, ^, $, {, } , 以外的字符匹配它自身, 比如 a 匹配 a

2. 点号 . : 匹配任意不包括换行符的单个字符。比如, sa. 可匹配 sat, sa*, sa[ 等。

3. 字符组[characters] :匹配字符组中指定字符集合中的任意单个字符: 比如 [abc] 将匹配 a 或 b 或 c , ca[ptb] 将匹配 cap, cat 或 cab。

4. 排除性字符组[^characters] : 匹配字符组中指定字符集合之外的任意单个字符:

比如, [^abc] 将匹配除了 a,b,c 之外的任意单个字符。

ca[^ptb],将匹配 caX 的文本,除了 cap, cat, cab, 注意,这里是匹配一个非指定的字符,而不是不匹配。

5. 范围字符组: [char1-char2] 将匹配从char1 到 char2 之间的任意单个字符(按照ASCII编码)。

比如, [a-z] 匹配任意小写字符; [A-Z] 匹配任意大写字符 ; [0-9] 匹配任意数字; [a-zA-Z0-9] 匹配任意大小写字符或数字。

6. 特殊字符: 凡是在正则式中具有特殊含义的字符,要匹配字符本身(将其作为普通文本)都必须使用反斜线 \ 进行转义;通常需要转义的字符有: . + * ? { } [ ] ( ) - \ ^ $。

比如, 匹配 . 的正则式是 \. , 匹配 \ 的正则式是 \\ , 匹配 ( 的正则式是 \( ;要匹配 (ab) 的正则表达式是 \(ab\) ; 要匹配 a? 的表达式是 a\? ; a? 将匹配空或单个a。

7. 匹配空白字符:

\f 换页 \n 换行 \r 回车 \t 制表符 \v 垂直制表符 \s 匹配任意空白符,包括上述任意一种

8. 字符类: <==> 等价于

\d <==> [0-9] 任意单个数字 \D <==> [^0-9] 任意单个的非数字字符

\w <==> [a-zA-Z0-9_] \W <==> [^a-zA-Z0-9_]

\s <==> [\f\n\r\t\v ] \S <==> [^\f\n\r\t\v ]

9. POSIX 字符类: 例如: [:digit:] <==> [0-9] ; [:alpha:] <==> [a-zA-Z] ; [:alnum:] <==> [a-zA-Z0-9]

具体应用时要再加一层括号,比如 TEST[[:digit:]] 匹配 TEST0 - TEST9。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剑轩~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值