随机产生数字和大小写字母,你会吗?

你好,我是刘卓。欢迎来到我的公号,excel函数解析。今天咱们来学习下随机产生数字和大小写字母的方法。也就是随机产生0-9,A-Z和a-z中的字符。

-01-
随机产生数字和大小写字母

下图就是用函数公式随机产生的数字和大小写字母,按F9结果会随机变化。既然是随机产生,肯定要用到随机函数rand或randbetween。对于这个问题,我这里给出4种方法。

第1种:large+randbetween+二维数组

公式为=CHAR(LARGE(ROW($1:$26)+{31,64,96},RANDBETWEEN(1,62))),按ctrl+shift+enter三键。向右向下填充。

下面说下这个公式的思路,我们知道0-9,A-Z,a-z一共是62个字符,对应的code码分别是48-57,65-90,97-122。

只要得到这62个数字(code码)的组合,然后随机从中取出一个,再用char转化为对应的字符就可以了。

ROW($1:$26)+{31,64,96}返回的结果如下图所示,是一个26行3列的二维数组。第1列是32到57,第2列是65到90,第3列是97到122。

其中后面两列符合A-Z和a-z的code码范围,第一列只需要48到57,32到47是多余的。

LARGE(ROW($1:$26)+{31,64,96},RANDBETWEEN(1,62))这部分用large从上面的二维数组中随机取第k个最大值,k的范围在1到62之间。

取第1个最大值得到122,取第62个最大值得到48,取1到62之间的第k个最大值,它的结果肯定在48-57,65-90,97-122之中。比如第50个最大值是67。
最后用char函数将随机得到的code码转为字符,就得到了随机产生的数字和大小写字母。

第2种:small+rand+二维数组

公式为=CHAR(-SMALL(-ROW($1:$26)-{31,64,96},RAND()*62+1)),按三键结束,右拉下拉填充。

这个公式和第1种方法的思路是一样的,只是取数的方式有所不同,由large改为small。

首先将得到的二维数组变成负数,这样最大值就变为最小值,然后用small取1到62之间随机的第k个最小值,将得到的结果添加负号变为原来的正数,最后用char转为对应的字符。

这里值得注意的是,当large和small的第2参数是小数时,它们是有区别的。

large的第2参数是小数时,向上舍入,比如large({1,2,3},2.1)=large({1,2,3},3);而small是向下舍入,比如small({1,2,3},2.9}=small({1,2,3},2}。

第3种:index+rand+一维数组

公式为=CHAR(INDEX(ROW($48:$109)+ROUND(INT(ROW($16:$77)/26)*6.5,),RAND()*62+1)),按三键结束,向右向下填充。

这个公式首先得到48-57,65-90,97-122这62个数字的组合,然后从中随机取出1个。

ROW($48:$109)返回的结果下图K列所示,是从48到109的62个连续自然数,由于数字太多只能用下图省略的方式来表示。

ROUND(INT(ROW($16:$77)/26)*6.5,)返回的结果如下图L列所示,由10个0,26个7,26个13组成。具体计算过程你自己查看。
这2部分相加得到N列的结果,刚好是48-57,65-90,97-122这62个数字。将这62个数字作为index的第1参数,第2参数是1-62的随机数,用RAND()*62+1表示。这样就是从这62个数中随机取一个,最后用char转为对应的字符。

第4种:text+常量数组

公式为=CHAR(SUM(24+TEXT(RAND()*62,{"[<10]!0;[<36]7;13","@"}))),不用三键,直接向右向下填充。

这个公式是根据第3种方法的分析得来的,并且充分利用了text的特性,运算速度也比较快。
原始公式为=CHAR(SUM(--TEXT(RAND()*62+48,{"[<58]!0;[<84]7;13","@"})))。
text的第1参数RAND()*62+48是48到109的随机数,第2参数用了个常量数组,有2个格式代码。第1个格式代码"[<58]!0;[<84]7;13"是个条件判断,第2个格式代码"@"不对数值设置格式,数值还显示为原来的值。
假如第1参数的结果是59,那么text返回的结果是{"7","59"}。"7"是由第1个格式代码得到的,"59"是由第2个格式代码得到的。
至于第1个格式代码"[<58]!0;[<84]7;13"是怎么来的,参考第3种方法的图片。
text的结果得到了,通过减负运算将文本变为数值,然后用sum将两个数值求和得到了目标数值,也就是code码,最后用char转化为字符。

将原始公式化简一下,把text中的48提取出来,得到了最开始的公式。

text果然是百变之王,用法太多了,总能带给人惊喜。你怎么看?

链接:

https://pan.baidu.com/s/1LrNko5gcU8zFQ25lG2dzaw

提取码:3imf
(0)

相关推荐