[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 【已解决】批处理如何实现大数字相乘运算

本帖最后由 ads350668398 于 2016-11-12 09:48 编辑

上次有人说网络延迟做种子于是:

系统x系统x网络延迟1x2x3
这个数值都在10位数以内 为什么? 怎么解决
  1. @echo off
  2. :a
  3. set /a r=%random% * %random% * %random% * %random% * %random%
  4. echo %r% >>11144.txt
  5. pause
  6. 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
1

评分人数

    • pcl_test: 发帖前先使用论坛搜索PB -4

本帖最后由 523066680 于 2016-11-2 17:57 编辑

一般整数占用4字节*8 bit的空间,一个bit用来表示正负,余下31个bit
2^31 = 2147483648,10位数

TOP

本帖最后由 ads350668398 于 2016-11-2 18:00 编辑

回复 2# 523066680


    那超出10位数那部分 不显示 了
虽然没有试验过 但是粗滤算算 上面计算的结果应该超出10位数了??
你是说话 就10位数 其他略。。没有了 是么 WIN 就这个样?

TOP

回复 3# ads350668398


      这就尴尬了

2147483648
||||||||||
0123456789

TOP

回复 4# 523066680
  1. @echo off
  2. :a
  3. set /a r=%random% * %random% * %random% * %random% * %random%
  4. REM 容我强行加一位
  5. echo %r%%random:~1,1% >>11144.txt
  6. REM 从1个字符截取是为了避免截到负号
  7. REM 各位,要学会变通……
  8. pause
  9. goto a
复制代码
1

评分人数

TOP

本帖最后由 happy886rr 于 2016-11-2 20:28 编辑

题目的数字太小了。
  1. @echo off
  2. REM 支持天文数字,不限长度,小数也行,已分装为函数,直接呼。
  3. call :MULTIPLICATION %random%×%random%×%random%×%random%×%random%×%random%×%random%×%random%
  4. pause&exit /b
  5. def MULTIPLICATION():
  6. {
  7. :MULTIPLICATION <表达式>
  8. set "expression=%1"
  9. if "!CHECK_ENABLE_DELAYED_EXPANSION!"=="%CHECK_ENABLE_DELAYED_EXPANSION%" (SETLOCAL) else (SETLOCAL ENABLEDELAYEDEXPANSION)
  10. set RESULT=1&set "expression=%expression:×= %"
  11. for %%a in (!expression!) do (
  12. CALL :CALCULATE !RESULT! %%a RESULT
  13. )
  14. echo 计算%1
  15. echo =!RESULT!
  16. ENDLOCAL
  17. GOTO :EOF
  18. }
  19. def CALCULATE():
  20. {
  21. :CALCULATE <被乘数> <乘数> [积]
  22. for /f "tokens=1,2 delims=." %%a in ("%1") do (
  23. set A1=%%a&set A=!A1!%%b
  24. if "%%b"=="" (set PA=0) else (
  25. set A2=%%b
  26. for %%i in (512 256 128 64 32 16 8 4 2 1) do (
  27.     if not "!A2:~%%i!"=="" (
  28. set/a PA+=%%i
  29. set "A2=!A2:~%%i!"
  30. )
  31. )
  32. if "!A2:~1!"=="" (set/a PA+=1)
  33. )
  34. )
  35. for /f "tokens=1,2 delims=." %%a in ("%2") do (
  36. set B1=%%a&set B=!B1!%%b
  37. if "%%b"=="" (set PB=0) else (
  38. set B2=%%b
  39. for %%i in (512 256 128 64 32 16 8 4 2 1) do (
  40.     if not "!B2:~%%i!"=="" (
  41. set/a PB+=%%i
  42. set "B2=!B2:~%%i!"
  43. )
  44. )
  45. if "!B2:~1!"=="" (set/a PB+=1)
  46. )
  47. )
  48. CALL :CUTNUM !A! A NA
  49. CALL :CUTNUM !B! B NB
  50. set/a "N=NA+NB,PO=PA+PB"
  51. for /l %%i in (1 1 !N!) do (
  52. for /l %%j in (1 1 %%i) do (
  53. set/a j=%%i-%%j+1
  54. if defined A[%%j] (
  55. if defined B[!j!] (
  56. set/a sum=A[%%j]*B[!j!]+sum
  57. )
  58. )
  59. )
  60. set/a s=sum+1000
  61. set sum=!sum:~0,-3!
  62. set pul=!s:~-3!!pul!
  63. )
  64. if !PO! equ 0 (
  65. for /l %%i in (1 1 10) do (
  66. if "!pul:~0,1!"=="0" (
  67. set pul=!pul:~1!
  68. )
  69. )
  70. set "%3=!pul!"
  71. ) else (
  72. set pre=!pul:~0,-%PO%!
  73. for /l %%i in (1 1 20) do (
  74. if "!pre:~0,1!"=="0" (
  75. set pre=!pre:~1!
  76. )
  77. )
  78. if not defined pre (set pre=0)
  79. set "%3=!pre!.!pul:~-%PO%!
  80. )
  81. for /l %%i in (1 1 !N!) do (set "A[%%i]="&set "B[%%i]=")&set "pul="&set/a "PA=0,PB=0,PO=0"
  82. GOTO :EOF
  83. }
  84. def CUTNUM():
  85. {
  86. :CUTNUM <待切分数> <数据类型> [切分组数]
  87. set num=%1
  88. if "!num:~-3!"=="!num:~-4!" (
  89. set %2[1]=!num!
  90. set %3=1
  91. GOTO :EOF
  92. )
  93. for /l %%i in (1 1 365) do (
  94. if "!num:~0,-3!"=="" (
  95. set/a %2[%%i]=!num!
  96. set %3=%%i
  97. GOTO :EOF
  98. )
  99. set/a %2[%%i]=1!num:~-3!-1000
  100. set num=!num:~0,-3%!
  101. )
  102. GOTO :EOF
  103. }
复制代码
5

评分人数

TOP

本帖最后由 523066680 于 2016-11-2 20:59 编辑
回复  523066680
老刘1号 发表于 2016-11-2 20:16



    我自然是知道的,但是逗楼主玩儿话题才能长啊。不过即使拼接了,要考虑分布是否足够均匀

抛开这些,
楼上happy大师要炸天了……  应该是考虑了分布方面以及做足了一些耐测试的细节工作

TOP

回复 5# 老刘1号

random "%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。"  不会有负号

r 是很多数的乘积, 过大会超出 31 位二进制表达范围, 出现上溢, 可能会有负号

TOP

回复 7# 523066680
我只是学徒,在看到你的动画时第一反应就是完全惊呆了,我那时只会echo,后来就不断的研究你的作品,学到好多巧妙的思维。

TOP

回复 9# happy886rr


    谦虚,有前途

TOP

本帖最后由 happy886rr 于 2016-11-2 21:10 编辑

回复 9# 523066680

我打算下一个目标就是去学perl。你的很多帖子都是很好的资料,这个论坛的好处就是非常通俗易懂的启蒙教程和许多充满智慧的创新思维。
我以前显示一个字符串只会用echo ,后来在论坛学到set/p=字符串<nul也能用来显示 ,因此思维就得到了扩充。这个论坛的最大作用就是思维的交流,这里的代码有情有义,而非其他网站的那种生硬的语法教学。

TOP

本帖最后由 523066680 于 2016-11-2 21:23 编辑

这是固定在500位,如果位数也要随机,可以把500改成 %random%,未测试分布是否均匀
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a buff=!random! %% 9 + 1      % [0-8] + 1 = [1-9] %
  4. :next
  5. for /l %%n in (0, 1, 500) do (
  6.     set /a x = !random! %% 10
  7.     set buff=!buff!!x!
  8. )
  9. echo !buff!
  10. pause
复制代码
==================================补充=====================================

其中一个结果
6570654070787720878720551520564154192193998902816086851452904732144780019389263586200609358950653640540242619622445932113675385232481440504623438397918374865436219267994386113298474419239439794012785659476174471571184545283730436865172796040135857465692690349178886482910237798021062959227243531344335976742355958334085783138354920855791983156491921655256801724083502037195999929886805102634476523685138718787280756603121554463142218441609413865654588056453274851408646034723618642147238107631842622898486346171400150238671844174223073868457046510677266833404164811528579151643300970194091506732646044721607114716237540238801066582316649602672155254967183641433828056846278706541918373354154436176687977337735914005638636289108728698662122250591192922873781132225809848909413217220497160987044321784755320503274415361064670506417109951777951111222172519465289853842156244986675282553667712469331648097063332329565699197760802460358860025507620311020220375535980742552681579267194201416296545361511061033132229425171804964956380912712880574289735155144987723538398876144643927011649368142860065206521080951410072310214738309933612629906040078995025943272985808367334126922713215030652270598089341655506525222164344623935615392900058431139684378733615416478425753085595906840603138655022293127711120382746730690034510817569126730222137879089915298096309542733178135333077497018928045033547214042951368905321303592357833425188129671106155648871469783589600635174576624144458652817686240363957276244093752533464020365754548948420976444946604540175389216850782016068141037517048275123108961231801061978236160159228954552297405638676471933384836504559844440037410300897730022226147134973911727130329398768902980084552959102675380922208804027740089273783909892148517075212312418936672315583206961836240840316707884746185230824901571077580429915363921908399664423038409552678182074047251837934431229524884831526295561413456446090584763221352938800162276291133256596855293786760318047286985255023989473547984833233983847923284802966866615029445113644516904917437498339533255046158352210438740752816485287044761486020089710916914364880674052199399944726075926756527896401239290707751491403269125102676498250998653950339055726816815543599198937750511414638552301909027944202412006034095597617684748593287812436742059507897666453594078617539361558330256811293655231032884373394020796110460686759887544451489198543637905084417218972162634595849594735499809032486317876298197512736428865595083479318380428132555974235750700995868919301811548996389255422572491392411029031919368516749639067403787804140114493033241464440416908322826690134919544855973555454479363684842166668835481089303763926715238636213111847338785631434983733273287033108797922615410378872371093734018706431177369046326975094468398206600124277449500926660577898185221616859684407486607688293000845316931162576906655833574231088247220174180269825643345895755355207563726454910084726104989494069745970446418113894219237308095772713693606694151473862606476709776050919276488111503171713251592941099452704901336316937605532384019345021361660866510969192901848286725146923982047084415449289941729895804237659249518421712691601744679459699712032614477800731219435605630291222428194388970019570850732383703317595584405024826984696527809044569140378668861071847112272444353673443595983291457834951799380387142068436770244777615309592446701075737658862523191871139760628985934709775481219649105130448395008117608530069493405458142708761913084015810569294748906127257923934762649921528686079586470396045723165991151884357449499690803061666975368843622668346316675214260936419073750673463209453387235840969557671237671575740149287124941624997065577276535728828540852790781839184687141687652921555756677051598684133169994715349486609526243742078412167948583780209586067438645436124072370918907914180255956090688606304224800344457105889192034079495903558278080713078328028683824078785164529728489228999243775051909585454654058876982818565169896337773792115199360311975637841567803141270252981798731706571145913180437051635174484196680372083141287456597230843521460592386052182277226088138923497167420411738045252549477679164055444846285315822186041862096416127137747921019637609214262733507281036927342612682915903852872556994459864928630294331515754530482054074332587164538024974183845656215480189843865260028849531882650759970878466152227510847597021210198227189378167026493955814065955559480093814615163112552528333852176816572363270656029383558391983362227620657397951255981190144631730577214371523663865679531782903619606485923483366809279826766883477856566857925092450034074555310029265382724922893924572726115776317349129700622337100834531466872102734389270354473881271217470058618325704951215911337174369738309136954379865236856504756023071294796891014330996133589430536818023525447241199761480334846833155610118346787459816213222603563513582436630623639114535902335149105131946324923327289540482724725859181390543172967743363076358915275378677125782984


各数字的出现频率
0 - 473
7 - 480
9 - 485
8 - 496
6 - 497
2 - 508
3 - 511
5 - 512
1 - 514
4 - 526

TOP

回复 12# 523066680
重复独立事件,随机本真性已被破坏。取余就会使其趋于古典概型。

TOP

回复 8# aa77dd@163.com
回复 9# 523066680

    哦,才发现……
不过刚测试了下VBS,貌似可以计算超过十位。
  1. echo off&cls
  2. (
  3. echo DIM num
  4. echo num=%random%*%random%*%random%*%random%*%random%
  5. echo wscript.echo num
  6. )>%tmp%\temp1.vbs
  7. %tmp%\temp1.vbs
  8. %0
复制代码
再写个FSO的话也是可以达到要求的
不过可能效率有些慢。
1

评分人数

TOP

回复 13# happy886rr


    也试了happy的代码,数的末尾有很大概率出现连续的0

TOP

返回列表