标题: [数值计算] 【已解决】批处理如何实现大数字相乘运算 [打印本页]
作者: ads350668398 时间: 2016-11-2 17:34 标题: 【已解决】批处理如何实现大数字相乘运算
本帖最后由 ads350668398 于 2016-11-12 09:48 编辑
上次有人说网络延迟做种子于是:
系统x系统x网络延迟1x2x3
这个数值都在10位数以内 为什么? 怎么解决- @echo off
- :a
- set /a r=%random% * %random% * %random% * %random% * %random%
- echo %r% >>11144.txt
- pause
- goto a
复制代码
结果:
1474814904
-1817508736
-10024324
929867920
-266064896
-1324759559
1086395000
1239936192
1262740224
-1946618048
-1530684760
-1457051712
-553049696
-1345529088
515262104
-625908224
-1686142725
-1942204376
2077469048
2009699680
664640064
524777008
1568926720
-765486169
-11524224
1455862912
-110101152
作者: 523066680 时间: 2016-11-2 17:47
本帖最后由 523066680 于 2016-11-2 17:57 编辑
一般整数占用4字节*8 bit的空间,一个bit用来表示正负,余下31个bit
2^31 = 2147483648,10位数
作者: ads350668398 时间: 2016-11-2 17:57
本帖最后由 ads350668398 于 2016-11-2 18:00 编辑
回复 2# 523066680
那超出10位数那部分 不显示 了
虽然没有试验过 但是粗滤算算 上面计算的结果应该超出10位数了??
你是说话 就10位数 其他略。。没有了 是么 WIN 就这个样?
作者: 523066680 时间: 2016-11-2 17:58
回复 3# ads350668398
这就尴尬了
2147483648
||||||||||
0123456789
作者: 老刘1号 时间: 2016-11-2 20:16
回复 4# 523066680 - @echo off
- :a
- set /a r=%random% * %random% * %random% * %random% * %random%
- REM 容我强行加一位
- echo %r%%random:~1,1% >>11144.txt
- REM 从1个字符截取是为了避免截到负号
- REM 各位,要学会变通……
- pause
- goto a
复制代码
作者: happy886rr 时间: 2016-11-2 20:25
本帖最后由 happy886rr 于 2016-11-2 20:28 编辑
题目的数字太小了。- @echo off
- REM 支持天文数字,不限长度,小数也行,已分装为函数,直接呼。
- call :MULTIPLICATION %random%×%random%×%random%×%random%×%random%×%random%×%random%×%random%
- pause&exit /b
-
- def MULTIPLICATION():
- {
- :MULTIPLICATION <表达式>
- set "expression=%1"
- if "!CHECK_ENABLE_DELAYED_EXPANSION!"=="%CHECK_ENABLE_DELAYED_EXPANSION%" (SETLOCAL) else (SETLOCAL ENABLEDELAYEDEXPANSION)
- set RESULT=1&set "expression=%expression:×= %"
- for %%a in (!expression!) do (
- CALL :CALCULATE !RESULT! %%a RESULT
- )
- echo 计算%1
- echo =!RESULT!
- ENDLOCAL
- GOTO :EOF
- }
- def CALCULATE():
- {
- :CALCULATE <被乘数> <乘数> [积]
- for /f "tokens=1,2 delims=." %%a in ("%1") do (
- set A1=%%a&set A=!A1!%%b
- if "%%b"=="" (set PA=0) else (
- set A2=%%b
- for %%i in (512 256 128 64 32 16 8 4 2 1) do (
- if not "!A2:~%%i!"=="" (
- set/a PA+=%%i
- set "A2=!A2:~%%i!"
- )
- )
- if "!A2:~1!"=="" (set/a PA+=1)
- )
- )
- for /f "tokens=1,2 delims=." %%a in ("%2") do (
- set B1=%%a&set B=!B1!%%b
- if "%%b"=="" (set PB=0) else (
- set B2=%%b
- for %%i in (512 256 128 64 32 16 8 4 2 1) do (
- if not "!B2:~%%i!"=="" (
- set/a PB+=%%i
- set "B2=!B2:~%%i!"
- )
- )
- if "!B2:~1!"=="" (set/a PB+=1)
- )
- )
- CALL :CUTNUM !A! A NA
- CALL :CUTNUM !B! B NB
- set/a "N=NA+NB,PO=PA+PB"
- for /l %%i in (1 1 !N!) do (
- for /l %%j in (1 1 %%i) do (
- set/a j=%%i-%%j+1
- if defined A[%%j] (
- if defined B[!j!] (
- set/a sum=A[%%j]*B[!j!]+sum
- )
- )
- )
- set/a s=sum+1000
- set sum=!sum:~0,-3!
- set pul=!s:~-3!!pul!
- )
- if !PO! equ 0 (
- for /l %%i in (1 1 10) do (
- if "!pul:~0,1!"=="0" (
- set pul=!pul:~1!
- )
- )
- set "%3=!pul!"
- ) else (
- set pre=!pul:~0,-%PO%!
- for /l %%i in (1 1 20) do (
- if "!pre:~0,1!"=="0" (
- set pre=!pre:~1!
- )
- )
- if not defined pre (set pre=0)
- set "%3=!pre!.!pul:~-%PO%!
- )
- for /l %%i in (1 1 !N!) do (set "A[%%i]="&set "B[%%i]=")&set "pul="&set/a "PA=0,PB=0,PO=0"
- GOTO :EOF
- }
- def CUTNUM():
- {
- :CUTNUM <待切分数> <数据类型> [切分组数]
- set num=%1
- if "!num:~-3!"=="!num:~-4!" (
- set %2[1]=!num!
- set %3=1
- GOTO :EOF
- )
- for /l %%i in (1 1 365) do (
- if "!num:~0,-3!"=="" (
- set/a %2[%%i]=!num!
- set %3=%%i
- GOTO :EOF
- )
- set/a %2[%%i]=1!num:~-3!-1000
- set num=!num:~0,-3%!
- )
- GOTO :EOF
- }
复制代码
作者: 523066680 时间: 2016-11-2 20:31
本帖最后由 523066680 于 2016-11-2 20:59 编辑
回复 523066680
老刘1号 发表于 2016-11-2 20:16
我自然是知道的,但是逗楼主玩儿话题才能长啊。不过即使拼接了,要考虑分布是否足够均匀
抛开这些,
楼上happy大师要炸天了…… 应该是考虑了分布方面以及做足了一些耐测试的细节工作
作者: aa77dd@163.com 时间: 2016-11-2 20:40
回复 5# 老刘1号
random "%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。" 不会有负号
r 是很多数的乘积, 过大会超出 31 位二进制表达范围, 出现上溢, 可能会有负号
作者: happy886rr 时间: 2016-11-2 20:52
回复 7# 523066680
我只是学徒,在看到你的动画时第一反应就是完全惊呆了,我那时只会echo,后来就不断的研究你的作品,学到好多巧妙的思维。
作者: 523066680 时间: 2016-11-2 20:53
回复 9# happy886rr
谦虚,有前途
作者: happy886rr 时间: 2016-11-2 21:08
本帖最后由 happy886rr 于 2016-11-2 21:10 编辑
回复 9# 523066680
我打算下一个目标就是去学perl。你的很多帖子都是很好的资料,这个论坛的好处就是非常通俗易懂的启蒙教程和许多充满智慧的创新思维。
我以前显示一个字符串只会用echo ,后来在论坛学到set/p=字符串<nul也能用来显示 ,因此思维就得到了扩充。这个论坛的最大作用就是思维的交流,这里的代码有情有义,而非其他网站的那种生硬的语法教学。
作者: 523066680 时间: 2016-11-2 21:13
本帖最后由 523066680 于 2016-11-2 21:23 编辑
这是固定在500位,如果位数也要随机,可以把500改成 %random%,未测试分布是否均匀- @echo off
- setlocal enabledelayedexpansion
-
- set /a buff=!random! %% 9 + 1 % [0-8] + 1 = [1-9] %
-
- :next
- for /l %%n in (0, 1, 500) do (
- set /a x = !random! %% 10
- set buff=!buff!!x!
- )
-
- echo !buff!
- pause
复制代码
==================================补充=====================================
其中一个结果
6570654070787720878720551520564154192193998902816086851452904732144780019389263586200609358950653640540242619622445932113675385232481440504623438397918374865436219267994386113298474419239439794012785659476174471571184545283730436865172796040135857465692690349178886482910237798021062959227243531344335976742355958334085783138354920855791983156491921655256801724083502037195999929886805102634476523685138718787280756603121554463142218441609413865654588056453274851408646034723618642147238107631842622898486346171400150238671844174223073868457046510677266833404164811528579151643300970194091506732646044721607114716237540238801066582316649602672155254967183641433828056846278706541918373354154436176687977337735914005638636289108728698662122250591192922873781132225809848909413217220497160987044321784755320503274415361064670506417109951777951111222172519465289853842156244986675282553667712469331648097063332329565699197760802460358860025507620311020220375535980742552681579267194201416296545361511061033132229425171804964956380912712880574289735155144987723538398876144643927011649368142860065206521080951410072310214738309933612629906040078995025943272985808367334126922713215030652270598089341655506525222164344623935615392900058431139684378733615416478425753085595906840603138655022293127711120382746730690034510817569126730222137879089915298096309542733178135333077497018928045033547214042951368905321303592357833425188129671106155648871469783589600635174576624144458652817686240363957276244093752533464020365754548948420976444946604540175389216850782016068141037517048275123108961231801061978236160159228954552297405638676471933384836504559844440037410300897730022226147134973911727130329398768902980084552959102675380922208804027740089273783909892148517075212312418936672315583206961836240840316707884746185230824901571077580429915363921908399664423038409552678182074047251837934431229524884831526295561413456446090584763221352938800162276291133256596855293786760318047286985255023989473547984833233983847923284802966866615029445113644516904917437498339533255046158352210438740752816485287044761486020089710916914364880674052199399944726075926756527896401239290707751491403269125102676498250998653950339055726816815543599198937750511414638552301909027944202412006034095597617684748593287812436742059507897666453594078617539361558330256811293655231032884373394020796110460686759887544451489198543637905084417218972162634595849594735499809032486317876298197512736428865595083479318380428132555974235750700995868919301811548996389255422572491392411029031919368516749639067403787804140114493033241464440416908322826690134919544855973555454479363684842166668835481089303763926715238636213111847338785631434983733273287033108797922615410378872371093734018706431177369046326975094468398206600124277449500926660577898185221616859684407486607688293000845316931162576906655833574231088247220174180269825643345895755355207563726454910084726104989494069745970446418113894219237308095772713693606694151473862606476709776050919276488111503171713251592941099452704901336316937605532384019345021361660866510969192901848286725146923982047084415449289941729895804237659249518421712691601744679459699712032614477800731219435605630291222428194388970019570850732383703317595584405024826984696527809044569140378668861071847112272444353673443595983291457834951799380387142068436770244777615309592446701075737658862523191871139760628985934709775481219649105130448395008117608530069493405458142708761913084015810569294748906127257923934762649921528686079586470396045723165991151884357449499690803061666975368843622668346316675214260936419073750673463209453387235840969557671237671575740149287124941624997065577276535728828540852790781839184687141687652921555756677051598684133169994715349486609526243742078412167948583780209586067438645436124072370918907914180255956090688606304224800344457105889192034079495903558278080713078328028683824078785164529728489228999243775051909585454654058876982818565169896337773792115199360311975637841567803141270252981798731706571145913180437051635174484196680372083141287456597230843521460592386052182277226088138923497167420411738045252549477679164055444846285315822186041862096416127137747921019637609214262733507281036927342612682915903852872556994459864928630294331515754530482054074332587164538024974183845656215480189843865260028849531882650759970878466152227510847597021210198227189378167026493955814065955559480093814615163112552528333852176816572363270656029383558391983362227620657397951255981190144631730577214371523663865679531782903619606485923483366809279826766883477856566857925092450034074555310029265382724922893924572726115776317349129700622337100834531466872102734389270354473881271217470058618325704951215911337174369738309136954379865236856504756023071294796891014330996133589430536818023525447241199761480334846833155610118346787459816213222603563513582436630623639114535902335149105131946324923327289540482724725859181390543172967743363076358915275378677125782984
各数字的出现频率
0 - 473
7 - 480
9 - 485
8 - 496
6 - 497
2 - 508
3 - 511
5 - 512
1 - 514
4 - 526
作者: happy886rr 时间: 2016-11-2 21:41
回复 12# 523066680
重复独立事件,随机本真性已被破坏。取余就会使其趋于古典概型。
作者: 老刘1号 时间: 2016-11-2 21:46
回复 8# aa77dd@163.com
回复 9# 523066680
哦,才发现……
不过刚测试了下VBS,貌似可以计算超过十位。- echo off&cls
- (
- echo DIM num
- echo num=%random%*%random%*%random%*%random%*%random%
- echo wscript.echo num
- )>%tmp%\temp1.vbs
- %tmp%\temp1.vbs
- %0
复制代码
再写个FSO的话也是可以达到要求的
不过可能效率有些慢。
作者: 523066680 时间: 2016-11-2 21:47
回复 13# happy886rr
也试了happy的代码,数的末尾有很大概率出现连续的0
作者: 523066680 时间: 2016-11-2 21:53
回复 14# 老刘1号
python 内置支持大数运算,相对方便。
作者: aa77dd@163.com 时间: 2016-11-2 22:02
回复 16# 523066680
手机号 11 位, 中国身份证号 18 位, 日常用到很长数字的场景并不多, 很长随机数就更少,
如果换科研场景, 那可以去撸专业的数学软件,
或者, 只是撸一把 算术 用字符串的实现算法
想象如 Mathematica 之类的软件, 它们在底层究竟用的什么样的算法, 我觉得很值得学习.
作者: 523066680 时间: 2016-11-2 22:13
本帖最后由 523066680 于 2016-11-2 22:29 编辑
回复 17# aa77dd@163.com
作为以图形为目标的业余党,考虑到时间有限,我时刻提醒自己不要扎进数学的洞里
除非从事相关工作,时间非常充裕。当然,正在争取。
关于更专业的随机数生成的讨论,我想起一本书上有,《应用密码学——协议、算法与C源程序》,
http://www.code-by.org/viewtopic.php?f=29&t=25
第16章 Pseudo-Random-Sequence Generators and Stream Ciphers
第17章 Other Stream Ciphers and Real Random-Sequence Generators
不过里面也提到了键盘敲击。
作者: Bella 时间: 2016-11-2 22:28
我有几个重要账户的密码都是 32 位
也不是随机数, 从 sha512 里取值
作者: aa77dd@163.com 时间: 2016-11-2 22:28
回复 18# 523066680
有序无序是相对的, 换个参照, 1,2,3,4,5,6,7,8,9,10 这就是个随机数序列
一流的密码技术 建基于 一流的数学理论
来来去去的总在数学的黑洞里, 再深还有混沌, 又一次深度扯!
作者: 523066680 时间: 2016-11-2 22:31
本帖最后由 523066680 于 2016-11-2 22:33 编辑
回复 20# aa77dd@163.com
跟24game和happy聊天感觉数学知识严重欠费,只能翻资料尽量跟上节奏了
对了这本书真的很好,我买了中文版。
作者: aa77dd@163.com 时间: 2016-11-2 22:57
回复 21# 523066680
丑话说在前, 你要是破解偶的密码, 偶就再也不和你玩了
作者: Bella 时间: 2016-11-2 23:09
本帖最后由 Bella 于 2016-11-3 00:47 编辑
回复 22# aa77dd@163.com
我这个账号的密码是键盘序, qwerty 之类的, 1 秒按完
这里的账号估计没人要, 一样的密码在 v2ex 被盗了, 把小爽的头像也改了...
v2ex 是 TLS 连接的, 如果加盐算法比较强, 也不容易被盗, hash($passwd.$salt)
键盘序举例, 弱密码的一种
!qaz@WSX
作者: 523066680 时间: 2016-11-2 23:19
本帖最后由 523066680 于 2016-11-2 23:26 编辑
回复 23# Bella
我现在在没那么重要的社区用密码是以前泄露过的密码,这样我就不担心再次泄露了
回复 11# happy886rr
我打算下一个目标就是去学perl。
happy886rr 发表于 2016-11-2 21:08
有那么点点坑(我相信其他语言如Ruby, Python也都有不同的坑),但是如果Perl的风格让你觉得舒适,期待后续的交流。
作者: aa77dd@163.com 时间: 2016-11-2 23:21
回复 23# Bella
还把那么可爱的头像也改了, 祝福那货喝水塞牙, 打呵欠扭腰, 排气砸后跟
作者: aa77dd@163.com 时间: 2016-11-2 23:29
本帖最后由 aa77dd@163.com 于 2016-11-2 23:34 编辑
回复 24# 523066680
然后 键盘被监听, 然后 密文传输被拦截, 然后 指纹被伪造, 然后 虹膜被复制, 然后 基因被克隆, 然后, 脑纹被量子复制, 然后, ...
然后, 想活命吗, 想就把密码给我,
然后, 给我密码, 这些$$$$$$$$ 就都是你的了
作者: 523066680 时间: 2016-11-2 23:36
本帖最后由 523066680 于 2016-11-2 23:38 编辑
回复 23# Bella
想前段时间还特地做了个终端wiki管理密码(只写一些助记信息)
但因为不断地爆出某某大网站密码泄露,搞得现在懒得去设计新密码了。
作者: 523066680 时间: 2016-11-2 23:39
回复 26# aa77dd@163.com
分分钟转战“消遣区”的节奏。坐等CrLf……
作者: Bella 时间: 2016-11-2 23:57
本帖最后由 Bella 于 2016-11-2 23:59 编辑
回复 27# 523066680
恭喜
作者: ads350668398 时间: 2016-11-3 09:41
回复 6# happy886rr
厉害 收藏了
作者: ads350668398 时间: 2016-11-3 09:52
这是固定在500位,如果位数也要随机,可以把500改成 %random%,未测试分布是否均匀======================= ...
523066680 发表于 2016-11-2 21:13
这个不是系统除以10 在加上你那个 什么运算 还整了500边啊 啊啊 哈哈
set /a buff=!random! %% 9 + 1 % [0-8] + 1 = [1-9] % 这一行 说说呗 !!!打算 换成延迟 啊啊 哈哈 随机是不是处来了 啊啊 哈哈哈哈
作者: terse 时间: 2016-11-3 20:10
很久不来了各位好 还是以前试着写过bat的大数计算
作者: aa77dd@163.com 时间: 2016-11-3 21:34
回复 32# terse
写的不是 BAT 是情怀
作者: CrLf 时间: 2016-11-8 00:02
回复 11# happy886rr
竟然不提段子...伤心
作者: CrLf 时间: 2016-11-8 00:05
回复 28# 523066680
尼玛,躺着中枪
作者: happy886rr 时间: 2016-11-8 23:27
本帖最后由 happy886rr 于 2016-11-8 23:32 编辑
回复 34# CrLf
可能大师没注意到,我以前发过了,沉下去了。我正在用C语言去实现cmd,到时候就不用微软的cmd了,用自己写的去解释批处理http://www.bathome.net/thread-42198-1-1.html,这个只完成了最基本的,我只要有时间,用不了多久,会实现解释65%的批处理代码,全部用内置函数解释,wmic可能没法解释,只能exec了。我正在写个虚拟机以运行自己的虚拟指令集,从而实现cmd的 编译。
作者: codegay 时间: 2016-11-8 23:40
回复 36# happy886rr
那不叫以前,应该是几天前。
作者: happy886rr 时间: 2016-11-8 23:59
本帖最后由 happy886rr 于 2016-11-9 00:00 编辑
回复 37# codegay
哈哈,兄记性真好。我打算把python 的一些特性也加进去,搞个杂交水稻吧。还要写个新的SQLM数据库,用的B树,还有“汉本”一种新的脚本。要写的太多了,正在学汇编,打算开发一种类似C语言一样高效的低级程序语言。
作者: aa77dd@163.com 时间: 2016-11-9 00:41
回复 38# happy886rr
从 仿 CMD 脚本解释器 到 数据库 到 程序设计语言, 你想做的越来越基础, 如果做成功了, 这些将在 计算机科技史上划上浓重的一笔
作者: happy886rr 时间: 2016-11-9 09:10
回复 39# aa77dd@163.com
兄的头像怎么换了?
作者: happy886rr 时间: 2016-11-9 09:16
本帖最后由 happy886rr 于 2016-11-9 09:25 编辑
回复 39# aa77dd@163.com
只能在批处理之家挠挠痒痒,业余玩玩,不亦乐乎。我也发现C语言和汇编是速度最快的,在同样的算法下,C比C++都快2倍,比python快十多倍。目前各类C编译器优化十分到位,我用汇编也只能跟C语言速度持平。
作者: aa77dd@163.com 时间: 2016-11-9 09:26
回复 41# happy886rr
你真乐于其中,祝你成功!
对于那些,我的智商,知识,精力都差太远,只能浅浅了解而已
作者: happy886rr 时间: 2016-11-9 09:51
回复 42# aa77dd@163.com
这不马上过年了,码几幅对联。弄个批处理写春联。
作者: 523066680 时间: 2016-11-9 11:41
老夫想了想,春联这事儿还得上其他语言
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |