Board logo

标题: [数值计算] 批处理生成100个不重复的随机数 [打印本页]

作者: xxx3212    时间: 2008-1-15 18:16     标题: 批处理生成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. )
复制代码

作者: xxx3212    时间: 2008-1-15 18:22

检查重复
  1. for /l %%a in (1,1,100) do (
  2. for /l %%b in (1,1,100) do (
  3.   set error=0
  4.   if not %%a==%%b if !n%%a!==!n%%b! set error=1
  5.   if !error!==1 echo %%a和%%b重复!
  6.   )
  7. )
  8. pause
复制代码

作者: youxi01    时间: 2008-1-15 19:51

对这段代码持慎重态度...
作者: xxx3212    时间: 2008-1-15 20:17

为什么 ??????
作者: 随风    时间: 2008-1-15 20:31     标题: 回复 2# 的帖子

这段代码,并没有“随机”
且 if not %%a==%%b if !n%%a!==!n%%b! set error=1
   if !error!==1
这些语句形同虚设,要和不要没有区别。
和以下的代码似乎并没有区别?
:
  1. @echo off
  2. for /l %%a in (1,1,100) do (
  3.   for /l %%b in (1,1,100) do (
  4.      echo %%a和%%b重复!
  5. ))
  6. pause
复制代码

作者: youxi01    时间: 2008-1-15 20:42     标题: 回复 5# 的帖子

其实,你也应该误会了他的意思
他的意思先定义了 100 个数字变量,然后用他这段代码来检测是否有重复...

我是对它这段代码的效率不敢恭维!!
一个数字检测 100 次,
那就是 100*100=10000次,效率还会高?
作者: xxx3212    时间: 2008-1-15 20:46

随风 你不是在一个主题为 “怎样求得一10位数的数”
写了一个 1到10 的随机数 并且没有重复吗?
作者: 随风    时间: 2008-1-15 20:51

设置100个变量 n1 - n100 每个变量的值为一个1-100的随机数 没有一个重复
如果是这样的话就简单了。
思路:
  先把1-100乱序,在把它们赋值给n1-n100变量不就可以了?
作者: xxx3212    时间: 2008-1-15 20:53

对 就这样
帮我写出代码啊
作者: xxx3212    时间: 2008-1-15 21:01

为什么 我不能自己设置头像

您设置的头像类型无效,请返回修改。
作者: 随风    时间: 2008-1-15 21:02

又想了下,发现楼主的意识是 变量名不能和值相同是吧?那么上面的思路就不全对了。
作者: xxx3212    时间: 2008-1-15 21:05

其实我真正的目的是这样的
set str=一二三四五六七八九十
我想输出一个打乱了的
比如输出 九三六十二一四五八七
作者: youxi01    时间: 2008-1-15 21:07     标题: 回复 8# 的帖子

完全正确...
我当初写 那个 10位数的时候采取的就是这种思想
让它们随机交换数据,呵呵...
作者: xxx3212    时间: 2008-1-15 21:10

主页有错误 对象不可用
作者: xxx3212    时间: 2008-1-15 21:10

版主怎么不把主页里的错误修补 我早就提过了的
作者: xxx3212    时间: 2008-1-15 21:12

行:43
字符:5
错误:缺少对象
作者: foxJL    时间: 2008-1-15 21:57

变量名和值各不重复且值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 编辑 ]
作者: youxi01    时间: 2008-1-15 22:29

呵呵,工作做完了,也贴一段玩玩(其实是原来写的那个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
复制代码

作者: foxJL    时间: 2008-1-15 22:38

楼上厉害呀.不用一个IF,
不过刚才测试了一下会出现值为空的情况,不知道是什么原因.
作者: youxi01    时间: 2008-1-15 22:58     标题: 回复 19# 的帖子

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

改成:
set /a rnd=100!random:~-2!%%100+1,var=!num%%i!
即可!!
18F已更新!!
作者: youxi01    时间: 2008-1-15 23:05     标题: 回复 17# 的帖子

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

测试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]
作者: youxi01    时间: 2008-1-16 10:01     标题: 回复 22# 的帖子

哦?
他没要求变量名不能等于 其对应的值  吧?!
作者: netbenton    时间: 2009-5-3 00:58

  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
复制代码

作者: dahual    时间: 2009-9-20 13:00

  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
复制代码
看来的,请大家给解释下,谢谢。
作者: liuchong.net    时间: 2009-9-20 14:07

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




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2