返回列表 发帖

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

要求:
1、随机数的位数为4位(首位不能为0),且随机数由四个不重复的数字组成;
2、随机数之间不能重复

管理员也不公布一下答案呀。。。。

TOP

@echo off
set ci=4
:start
set /a w=%random%%%9+1,y=9
set "var=0 1 2 3 4 5 6 7 8 9"
call set "var=%%var:%w%=%%"
for /l %%a in (1 1 3) do call :loop
if not defined _%w% (
   set _%w%=a
   echo %w%
   set /a ci-=1
)
if %ci% neq 0 goto start
echo\&pause&exit
:loop
set /a n=%random%%%%y%+1
for /f "tokens=%n%" %%a in ("%var%") do set "m=%%a"
set /a "y-=1"
set "w=%w%%m%"
call set "var=%%var:%m%=%%"
goto :eofCOPY
技术问题请到论坛发帖求助!

TOP

哇!昨天刚回复完,今天就有了,真不错。。不像一般的论坛。里面产生随机数那一行,w=%random%%%9+1,y=9 后面三个%能解释是什么意思么?

TOP

回复 4楼 的帖子

这个代码他自己解释是最清楚的,呵呵,旁人还是不说了/

TOP

回复 3楼 的帖子

兄的代码是不是人为的复杂化了?

TOP

回复 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
技术问题请到论坛发帖求助!

TOP

@echo off
setlocal enabledelayedexpansion
set var=123456789
set /a h1=%random%%%9+1
set var=!var:%h1%=0!
for /l %%i in (9,-1,7) do (
        set /a temp=!random!%%%%i
        call set h%%i=%%var:~!temp!,1%%
        call set var=%%var:!h%%i!=%%
)
echo %h1%%h9%%h8%%h7%
pauseCOPY
3

评分人数

TOP

思路很巧啊
技术问题请到论坛发帖求助!

TOP

回复 8楼 的帖子

似乎只产生一个随机数
对于多个随机数,没有进行重复性判断(尽管这种几率很小)

TOP

来一段“无赖”代码,通过for中循环值调整随机度。
@echo off
setlocal enabledelayedexpansion
set /a str=123456789
for /l %%i in (1 1 10) do (
     set /a num=!random! %% 9+1
     call set str=%%str:!num!=%%!num!
)
echo !str:~2,4!
pauseCOPY
1

评分人数

TOP

回复 11楼 的帖子

首位不能为0,但其它位可以为0。

TOP

来个思路一般的:
@echo off
:loop
setlocal enabledelayedexpansion
:num
set /a t=!random!%%10
if defined %t% goto num
set %t%=ok
set n=%n%%t%
if "%n:~3%" == "" goto num
if %n% lss 1000 (endlocal&goto loop)
echo %n%
pauseCOPY
再来个效率超低的:
@echo off
:loop
setlocal enabledelayedexpansion
for /l %%i in (0,1,9) do set +!random!=%%i
for /f "skip=6 delims=" %%j in ('set +^|sort') do (
set t=%%j
set a=!a!!t:~-1!
)
if !a! lss 1000 (endlocal&goto loop)
echo !a!
pauseCOPY
静水流深...

TOP

我也试试

请问楼主:是产生一个四位数都不重复的数,还是产生四个四位数都不重复的数??
思路:随机取出该数的千、百、十、个位的数字,然后判断该数是否跟前面取的数重复;还要判断是否已经取满四个数
@echo off
setlocal enabledelayedexpansion
set str=0123456789
:main
cls
set var=
:a
set s1=!str:0=!
set/a num=%random%%%9
set num1=!s1:~%num%,1!
set s2=!str:%num1%=!
set/a num=%random%%%9
set num2=!s2:~%num%,1!
set s3=!s2:%num2%=!
set/a num=%random%%%8
set num3=!s3:~%num%,1!
set s4=!s3:%num3%=!
set/a num=%random%%%7
set num4=!s4:~%num%,1!
set num=!num1!!num2!!num3!!num4!
set/a n=0
for %%a in (!var!) do (
set/a n+=1
if %%a equ !num! goto :a
)
if !n!==4 (echo !var!&pause>nul&goto main) else (set var=!var! !num!&goto :a)COPY

[ 本帖最后由 sjzong 于 2009-4-25 15:55 编辑 ]

TOP

我也来一个吧。能生成一批四位不重复的随机数:
@echo off&setlocal enabledelayedexpansion
::生成四位的随机数100
for /l %%i in (1,1,100) do (set/a #%%i=!random!%%9000+1000)
::过滤掉有重复数字的随机数
for /l %%i in (0,1,100) do (
for /l %%j in (0,1,9) do (
set ss=!#%%i:%%j=!
if !ss! lss 100 (set "#%%i=")
)
)
for /f "tokens=2 delims=#=" %%i in ('set #') do echo %%i
pauseCOPY
2

评分人数

TOP

返回列表