[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
和楼上的基本相似,理了理思路,这样代码更易懂:
  1. @echo off
  2. (for /l %%i in (1,1,500) do (
  3.     setlocal enabledelayedexpansion
  4.     for /l %%j in (0,1,99) do (
  5.         set /a n+=1
  6.         if %%j lss 10 (
  7.             set _!random!-!n!=0%%j
  8.         ) else (
  9.             set _!random!-!n!=%%j
  10.         )
  11.     )
  12.     for /f "tokens=2 delims==" %%k in ('set _') do (
  13.         set /a m+=1
  14.         if !m! leq 50 (
  15.             set str1=!str1! %%k
  16.         ) else (
  17.             set str2=!str2! %%k
  18.         )
  19.     )
  20.     echo,!str1!
  21.     echo,!str2!
  22.     endlocal
  23. ))>1.txt
  24. pause
复制代码
1

评分人数

TOP

回复 23# pd1
是算术题,1002行重复个数就是501,2000行个数就是1000。

TOP

本帖最后由 qixiaobin0715 于 2023-9-4 13:15 编辑

回复 18# pd1
我觉得WHY的思路没有问题。楼主的题目要求决定了只要出现一行随机数,必定要跟随互补的另一行。可以自己手工排排看,按最简单4行或6行,每个数出现2次或3次。只不过代码输出的是:单数行紧跟一偶数行,为互补行,给人表面的感觉不是随机的,实际上互补行是必须出现的。如果按照楼主的要求,最终数据都是两两互补,没有意外,只是出现的位置可以不同而已。
1

评分人数

TOP

回复 26# pd1
唐突了,是我自己考虑欠妥。

TOP

回复 23# pd1
又看了看,开始回复23楼的帖子也是文不对题,没有理解你所说的意思,抱歉。

TOP

本帖最后由 qixiaobin0715 于 2023-9-5 13:13 编辑

回复 23# pd1
以下代码根据你在23楼的思路写的,由于比较匆忙,看起来不是很明晰,未考虑效率问题,测试约1分钟左右。简要说明如下:
1.每次循环需要得到100个给定字符使用次数。(第17行)
2.判断给定的字符使用次数是否达到上限,若达到上限则忽略,否则按正常方法设置变量,以便继续使用。(第9行)
3.判断给定的字符尚可使用的次数是否达到剩余行数,若是,则本次优先使用(通过在未达到剩余行数上限的字符的变量名前加上字母,使达到剩余行数的字符变量在后面的循环中优先排在前面)。(第19、6-10行)
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /l %%i in (1,1,1000) do (
  4.         for /l %%j in (0,1,99) do (
  5.         set num=0%%j
  6.         if !@%%j! equ 0 (
  7.             set _!random!_%%j=!num:~-2!
  8.         ) else (
  9.             if !#%%j! neq 500 set _a!random!_%%j=!num:~-2!
  10.         )
  11.     )
  12.     set n=0
  13.     for /f "tokens=1-3 delims==_" %%a in ('set _') do (
  14.         set /a n+=1
  15.         if !n! leq 50 (
  16.             set str=!str! %%c
  17.             set /a #%%b+=1
  18.         )
  19.         set /a @%%b=1000-%%i-500+#%%b
  20.         set _%%a_%%b=
  21.     )
  22.     echo,!str!
  23.     set str=
  24. ))>1.txt
  25. pause
复制代码
4

评分人数

    • pd1: 还没看懂 批处理长一点我看着就费劲技术 + 1
    • 思想之翼: 感谢分享技术 + 1
    • buyiyang: 好算法技术 + 1
    • 77七: 高手!技术 + 1

TOP

回复 37# buyiyang
这是预料之中的事,后面生成的行属于查漏补缺,参见说明第2点。由于前面使用给定字符的频率陆续达到楼主所说的500次,这些字符在后面不能再继续使用,这些字符不再被设置为变量,请看代码第9行,所以可选的字符会越来越少,就会造成你所说的现象。
我觉得这种情况应当无关大局。如果非要消除这种情况的出现,可以通过调整部分 行的顺序来解决,方法很多,在这里举2个例子供参考:
1.掐头藏尾法或者叫移花接木法
思路是把前面若干行移到最后。
比如把前100行保存为2.txt,其余保存为1.txt,用copy或其它命令将2.txt合并到1.txt末尾。
替换第22行代码如下
  1. if %%i leq 100 (
  2.     echo,!str!>>2.txt
  3. ) else (
  4.     echo,!str!
  5. )
复制代码
然后将1.txt和2.txt在代码pause前完成合并。

实际上叫障眼法更准确。  
2.二次排列法
替换代码第22行
  1. echo,!random!:!str!
复制代码
在pause前增加如下代码
  1. sort 1.txt>2.txt
  2. (for /f "tokens=1*" %%i in (2.txt) do echo,%%j)>1.txt
  3. del 2.txt
复制代码
1

评分人数

TOP

本帖最后由 qixiaobin0715 于 2023-9-12 09:12 编辑

实际上可以将楼主顶楼的例子改成更通用的问题:
1.从00-99中,随机抽取50个不重复的字符,组成1行,每行50列。
2.抽取n次组成n行。(n为偶数)
3.最终的文本要控制每个字符个数均等,即00-99每个字符均要出现n/2次。
代码中n要求自定义,可以随意更改,只要是偶数即可。不使用两两互补法。
1

评分人数

    • 思想之翼: 举一反三,透过现象看本质。技术 + 1

TOP

本帖最后由 qixiaobin0715 于 2023-9-8 12:50 编辑

我是说代码不使用两两互补“法”。
不是说不能出现两两互补的情况。

TOP

返回列表