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

[数值计算] 批处理生成100个不重复的随机数

设置100个变量 n1 - n100 每个变量的值为一个1-100的随机数 没有一个重复
查看是否有重复代码
  1. for /l %%a in (1,1,100) do (
  2. set error=0
  3. for /l %%b in (1,1,100) do (
  4.   if not %%a==%%b if !n%%a!==!n%%b! set error=1
  5.   if !error!==1 echo %%a和%%b重复!
  6.   )
  7. )
复制代码

先排序,然后检测相邻的数字是否相同不就得了?

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,100) do set ".!random!-%%a=%%a"
  3. for /f "tokens=2 delims==" %%a in ('set .') do set /p=%%a<nul & echo.
  4. pause>nul
复制代码
看来的,请大家给解释下,谢谢。

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 100) do set num%%i=%%i
  3. for /l %%i in (100 -1 1) do (
  4.     set /a rnd=!random!%%%%i+1,n+=1
  5.     for %%a in (!rnd!) do echo !n!=!num%%a!&set/a num!rnd!=num%%i
  6. )
  7. pause>nul
复制代码

TOP

回复 22# 的帖子

哦?
他没要求变量名不能等于 其对应的值  吧?!

TOP

测试youxi 18楼更新后的代码,出现重复现象,见附件。
代码仍未十分看懂,就象绕口令,绕的我有点头晕,暂时不知道出错原因,有空再研究。
错误应该是随机数,随机数重复时应该会出错。
测试代码如下:
:
  1. @echo off & setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 100) do set num%%i=%%i
  3. for /l %%i in (1 1 100) do (
  4.     set /a rnd=100!random:~-2!%%100+1,var=!num%%i!
  5.     call set num%%i=%%num!rnd!%%
  6.     set num!rnd!=!var!
  7. )
  8. for /l %%i in (1 1 100) do if "%%i"=="!num%%i!" echo %%i=!num%%i!
  9. pause
复制代码
[attach]72[/attach]
技术问题请到论坛发帖求助!

TOP

回复 17# 的帖子

观察17F的代码,思路其实和if defined差不多,基本原理是检测
z%n%是否已经被 赋值 为1,如果是则说明已经重复...,然后goto(呵呵,不知道说的对不对)
个人觉得,这种办法效率会较低,数值越多,效率越低(因为数值越多,重复的可能性越多)...

TOP

回复 19# 的帖子

呵呵,这句出了点问题(可能为0)
set /a rnd=100!random:~-2!%%100,var=!num%%i!

改成:
set /a rnd=100!random:~-2!%%100+1,var=!num%%i!
即可!!
18F已更新!!

TOP

楼上厉害呀.不用一个IF,
不过刚才测试了一下会出现值为空的情况,不知道是什么原因.

TOP

呵呵,工作做完了,也贴一段玩玩(其实是原来写的那个10位数的,稍做修改)
  1. @echo off & setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 100) do set num%%i=%%i
  3. for /l %%i in (1 1 100) do (
  4.     set /a rnd=100!random:~-2!%%100+1,var=!num%%i!
  5.     call set num%%i=%%num!rnd!%%
  6.     set num!rnd!=!var!
  7. )
  8. for /l %%i in (1 1 100) do echo %%i=!num%%i!
  9. pause>nul
复制代码

TOP

变量名和值各不重复且值1-100之间不重复
大家测试看看代码有没有问题
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1,1,100) do (call :ran %%i&echo %%i=!%%i!)
  3. pause>nul&exit
  4. :ran
  5. set /a n=%random% %% 101
  6. if %n% equ 0 (goto ran) else (
  7.         if !z%n%! equ 0 (
  8.                 if %n% equ %1 (goto ran) else (
  9.                 set %1=%n%&set /a z%n%+=1
  10.                 )
  11.         ) else (goto ran)
  12. )
  13. goto :eof
复制代码

[ 本帖最后由 foxJL 于 2008-1-16 09:59 编辑 ]
1

评分人数

TOP

行:43
字符:5
错误:缺少对象

TOP

版主怎么不把主页里的错误修补 我早就提过了的

TOP

主页有错误 对象不可用

TOP

回复 8# 的帖子

完全正确...
我当初写 那个 10位数的时候采取的就是这种思想
让它们随机交换数据,呵呵...

TOP

返回列表