ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: apolloh

[Excel 函数与公式] [开_51] 给大家一次得5分的机会 ★★★

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2005-7-27 08:08 | 显示全部楼层

整50个(=不算) 数组公式

=CHAR(LARGE({0,33,65}+ROW(32:57),INT(RAND()*62)+1))

另:也想过把int函数去掉(更短),不过,在large和small函数中,取数组排名带小数的,有时会取到意外值,此例中如果省略int函数,随机会出现"/"字符.

YOU ARE GREAT!!![em17][em17][em17][em17][em17]

现在你是全球记录创造和保持者!

——apolloh

[此贴子已经被apolloh于2005-7-27 19:08:49编辑过]

TA的精华主题

TA的得分主题

发表于 2005-7-27 09:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

=CHAR(SMALL(IF(MOD(ROW(56:130),33)<ROW(216:142)/33,ROW(48:122)),(RAND()*62+1)))

共79位,好不容易凑了一个,我自己已经验证,虽然不太好,但好象还是对的,第一次用RAND,还得向老大们学习

另外向asdf1001致敬,

好像通不过啊,是不是相对引用出的错?只要90个字符内,应该还有许多方法——apolloh

[此贴子已经被apolloh于2005-7-27 9:51:57编辑过]

TA的精华主题

TA的得分主题

发表于 2005-7-27 10:07 | 显示全部楼层

噢,是我复制错了,请看这个行不行

=CHAR(LARGE(IF(8-MOD(ROW(56:130),33)<ROW(48:122)/33,ROW(48:122),""),INT(RAND()*62+1)))

去掉"=",共86位

那个int好象不能省略,否则按CTRL+ALT+F9时,有时会出错

简单修改可以这样,CHAR(LARGE(IF(8-MOD(ROW(56:130),33)<ROW(48:122)/33,ROW(48:122)),INT(RAND()*62+1))),82个字符——apolloh

谢谢版主,当时因为怕出错,没有信心,所以特意添加进去了,现在看来还是可以简化的

另外asdf1001的公式真是太棒了,很精彩,因为以前没有用过多维数组公式,好不容易看懂,受益非浅!

[此贴子已经被apolloh于2005-7-27 10:35:11编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-27 11:13 | 显示全部楼层

此题在MrExcel论坛中,花了10多天才得到61个字符的答案,出自常来我们论坛的新加坡华人bosco_yip

=CHAR(LOOKUP(RAND(),{0,5,18}/31,{48;65;97}+RAND()*{10;26;26}))

而这个答案yigepure,只花了几小时的时间

50个字符,asdf1001才花了不到24小时。

=CHAR(LARGE({0,33,65}+ROW(32:57),INT(RAND()*62)+1))

而且我们的会员提供了许多新的思路

可以见得,Excelhome们非常优秀!!!

[此贴子已经被作者于2005-7-27 11:19:38编辑过]

TA的精华主题

TA的得分主题

发表于 2005-7-27 11:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

呵呵,谢谢各位版竹的点评.

(获奖感言)中间也走了些弯路,虽然平时比较喜欢精简,但更喜欢快速解决问题.于是,我的第一个答案,相信是90以内最长的公式了.也是最简单的了.

如果让我选择使用什么公式,我宁愿选我给的第一个答案.通俗易懂,能解决问题.

[em04]

TA的精华主题

TA的得分主题

发表于 2005-7-27 11:32 | 显示全部楼层
apolloh老大不但电脑水平高,而且英语也特别棒,佩服,能介绍一下,老大是做什么工作的吗?

TA的精华主题

TA的得分主题

发表于 2005-7-27 11:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2005-7-27 12:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

学习了一天,又站在巨人的肩膀上,终于想出了一个。

=CHAR(INDEX({48;65;97}+RAND()*{10;26;26},RAND()*31/13+21/13))

算过,试过,还行。

很好的思路,60个字符,还可以再短些,给你算是59个字符,而且这个速度不赖:)

CHAR(INDEX({48;65;97}+RAND()*{10;26;26},(RAND()*31+21)/13))

——apolloh

有朋友短信说这个公式不太明白,我来解释一下

(Rand()*31+21)/13

也可写作

(Rand()*62+42)/26

(Rand()*31+21)/13产生21<=X<52之间的31个数,因为0<=Rand()<1,这些数除以13

得到21/13<=Y<4之间的31个数,

其中

21/13<=Y<2 5个

2<=Y<3 13个

3<=Y<4 13个

正好和数字,大写字母,小写字母的个数比例是一致的。所以可以得到均等的机会

--apolloh

解法过程:

按三个区域引用(查找)要求列式:

(1,2,3)<=rand()*A+B<4

根据字符出现机率得方程:

A*10/62+B=2;

A*(10+26)/62+B=3;

A*(10+26+26)/62+B=4;

解得A=31/13,B=21/13。

[此贴子已经被作者于2005-7-28 9:32:21编辑过]

TA的精华主题

TA的得分主题

发表于 2005-7-27 13:00 | 显示全部楼层

向各位学习了,自知无法超越,做了2个公式,共同学习:

=CHAR(INDEX({48;65;97}+RAND()*{10;26;26},MATCH(RAND(),{0;5;18}/31)))

67个字符,奇怪这个方法怎么需要这么久才有人想出——apolloh

=CHAR(VLOOKUP(RAND(),IF({1,0},{0;5;18}/31,{48;65;97}+RAND()*{10;26;26}),2))

74个字符,只能按最短的算分:)——apolloh

[此贴子已经被apolloh于2005-7-27 13:57:19编辑过]

TA的精华主题

TA的得分主题

发表于 2005-7-28 09:55 | 显示全部楼层

=CHAR(ROUND(MOD(RAND()*10000,74),0)+48)

这个答案没有排除ASCII在58-64,91-96之间不符合要求的字符——apolloh

[此贴子已经被apolloh于2005-7-28 10:05:22编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 04:01 , Processed in 0.049828 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表