找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 107939|回复: 53

批处理产生四个四位不重复的随机数

[复制链接]
发表于 2008-1-3 23:19:46 | 显示全部楼层 |阅读模式
要求:
1、随机数的位数为4位(首位不能为0),且随机数由四个不重复的数字组成;
2、随机数之间不能重复
发表于 2008-4-3 23:30:10 | 显示全部楼层
管理员也不公布一下答案呀。。。。
发表于 2008-4-4 00:28:10 | 显示全部楼层
  1. @echo off
  2. set ci=4
  3. :start
  4. set /a w=%random%%%9+1,y=9
  5. set "var=0 1 2 3 4 5 6 7 8 9"
  6. call set "var=%%var:%w%=%%"
  7. for /l %%a in (1 1 3) do call :loop
  8. if not defined _%w% (
  9.    set _%w%=a
  10.    echo %w%
  11.    set /a ci-=1
  12. )
  13. if %ci% neq 0 goto start
  14. echo\&pause&exit
  15. :loop
  16. set /a n=%random%%%%y%+1
  17. for /f "tokens=%n%" %%a in ("%var%") do set "m=%%a"
  18. set /a "y-=1"
  19. set "w=%w%%m%"
  20. call set "var=%%var:%m%=%%"
  21. goto :eof
复制代码
发表于 2008-4-4 10:53:44 | 显示全部楼层
哇!昨天刚回复完,今天就有了,真不错。。不像一般的论坛。里面产生随机数那一行,w=%random%%%9+1,y=9 后面三个%能解释是什么意思么?
 楼主| 发表于 2008-4-4 11:13:12 | 显示全部楼层

回复 4楼 的帖子

这个代码他自己解释是最清楚的,呵呵,旁人还是不说了/
 楼主| 发表于 2008-4-4 11:13:56 | 显示全部楼层

回复 3楼 的帖子

兄的代码是不是人为的复杂化了?
发表于 2008-4-4 12:54:23 | 显示全部楼层

回复 6楼 的帖子

你觉得是人为的复杂了?
我似乎精简不出来了。代码最主要的是想考虑效率问题,避免反复 goto

回 4 楼
set /a w=%random%%%9+1,y=9
可以看成
set /a w=%random%%%9+1
set /a y=9
set /a w=%random%%%9+1  %rqndom% 是个随机数 %% 代表取余操作。9+1 代表取的数底数为 1 范围是 9
发表于 2008-4-4 14:18:10 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set var=123456789
  4. set /a h1=%random%%%9+1
  5. set var=!var:%h1%=0!
  6. for /l %%i in (9,-1,7) do (
  7.         set /a temp=!random!%%%%i
  8.         call set h%%i=%%var:~!temp!,1%%
  9.         call set var=%%var:!h%%i!=%%
  10. )
  11. echo %h1%%h9%%h8%%h7%
  12. pause
复制代码

评分

参与人数 3PB +13 技术 +1 精华 +1 收起 理由
chencg + 1 厉害
youxi01 + 8 + 1 总体思路非常不错
随风 + 5 不错

查看全部评分

发表于 2008-4-4 14:46:01 | 显示全部楼层
思路很巧啊
 楼主| 发表于 2008-4-4 14:47:16 | 显示全部楼层

回复 8楼 的帖子

似乎只产生一个随机数
对于多个随机数,没有进行重复性判断(尽管这种几率很小)
 楼主| 发表于 2008-4-4 15:14:22 | 显示全部楼层
来一段“无赖”代码,通过for中循环值调整随机度。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a str=123456789
  4. for /l %%i in (1 1 10) do (
  5.      set /a num=!random! %% 9+1
  6.      call set str=%%str:!num!=%%!num!
  7. )
  8. echo !str:~2,4!
  9. pause
复制代码

评分

参与人数 1PB +5 收起 理由
随风 + 5 妙啊

查看全部评分

发表于 2008-4-4 16:39:19 | 显示全部楼层

回复 11楼 的帖子

首位不能为0,但其它位可以为0。
发表于 2008-4-4 20:41:43 | 显示全部楼层
来个思路一般的:
  1. @echo off
  2. :loop
  3. setlocal enabledelayedexpansion
  4. :num
  5. set /a t=!random!%%10
  6. if defined %t% goto num
  7. set %t%=ok
  8. set n=%n%%t%
  9. if "%n:~3%" == "" goto num
  10. if %n% lss 1000 (endlocal&goto loop)
  11. echo %n%
  12. pause
复制代码
再来个效率超低的:
  1. @echo off
  2. :loop
  3. setlocal enabledelayedexpansion
  4. for /l %%i in (0,1,9) do set +!random!=%%i
  5. for /f "skip=6 delims=" %%j in ('set +^|sort') do (
  6. set t=%%j
  7. set a=!a!!t:~-1!
  8. )
  9. if !a! lss 1000 (endlocal&goto loop)
  10. echo !a!
  11. pause
复制代码
发表于 2009-4-25 15:38:46 | 显示全部楼层

我也试试

请问楼主:是产生一个四位数都不重复的数,还是产生四个四位数都不重复的数??
思路:随机取出该数的千、百、十、个位的数字,然后判断该数是否跟前面取的数重复;还要判断是否已经取满四个数
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=0123456789
  4. :main
  5. cls
  6. set var=
  7. :a
  8. set s1=!str:0=!
  9. set/a num=%random%%%9
  10. set num1=!s1:~%num%,1!
  11. set s2=!str:%num1%=!
  12. set/a num=%random%%%9
  13. set num2=!s2:~%num%,1!
  14. set s3=!s2:%num2%=!
  15. set/a num=%random%%%8
  16. set num3=!s3:~%num%,1!
  17. set s4=!s3:%num3%=!
  18. set/a num=%random%%%7
  19. set num4=!s4:~%num%,1!
  20. set num=!num1!!num2!!num3!!num4!
  21. set/a n=0
  22. for %%a in (!var!) do (
  23. set/a n+=1
  24. if %%a equ !num! goto :a
  25. )
  26. if !n!==4 (echo !var!&pause>nul&goto main) else (set var=!var! !num!&goto :a)
复制代码

[ 本帖最后由 sjzong 于 2009-4-25 15:55 编辑 ]
发表于 2009-4-25 17:36:23 | 显示全部楼层
我也来一个吧。能生成一批四位不重复的随机数:
  1. @echo off&setlocal enabledelayedexpansion
  2. ::生成四位的随机数100个
  3. for /l %%i in (1,1,100) do (set/a #%%i=!random!%%9000+1000)
  4. ::过滤掉有重复数字的随机数
  5. for /l %%i in (0,1,100) do (
  6. for /l %%j in (0,1,9) do (
  7. set ss=!#%%i:%%j=!
  8. if !ss! lss 100 (set "#%%i=")
  9. )
  10. )
  11. for /f "tokens=2 delims=#=" %%i in ('set #') do echo %%i

  12. pause
复制代码

评分

参与人数 2PB +19 收起 理由
523066680 + 8 开阔视野了
随风 + 11 思路妙极了!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:30 , Processed in 0.025469 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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