标题: [数值计算] 批处理生成100个不重复的随机数 [打印本页]
作者: xxx3212 时间: 2008-1-15 18:16 标题: 批处理生成100个不重复的随机数
设置100个变量 n1 - n100 每个变量的值为一个1-100的随机数 没有一个重复
查看是否有重复代码
- for /l %%a in (1,1,100) do (
- set error=0
- for /l %%b in (1,1,100) do (
- if not %%a==%%b if !n%%a!==!n%%b! set error=1
- if !error!==1 echo %%a和%%b重复!
- )
- )
复制代码
作者: xxx3212 时间: 2008-1-15 18:22
检查重复- for /l %%a in (1,1,100) do (
- for /l %%b in (1,1,100) do (
- set error=0
- if not %%a==%%b if !n%%a!==!n%%b! set error=1
- if !error!==1 echo %%a和%%b重复!
- )
- )
- 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
这些语句形同虚设,要和不要没有区别。
和以下的代码似乎并没有区别?
:- @echo off
- for /l %%a in (1,1,100) do (
- for /l %%b in (1,1,100) do (
- echo %%a和%%b重复!
- ))
- 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之间不重复
大家测试看看代码有没有问题- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1,1,100) do (call :ran %%i&echo %%i=!%%i!)
- pause>nul&exit
- :ran
- set /a n=%random% %% 101
- if %n% equ 0 (goto ran) else (
- if !z%n%! equ 0 (
- if %n% equ %1 (goto ran) else (
- set %1=%n%&set /a z%n%+=1
- )
- ) else (goto ran)
- )
- goto :eof
复制代码
[ 本帖最后由 foxJL 于 2008-1-16 09:59 编辑 ]
作者: youxi01 时间: 2008-1-15 22:29
呵呵,工作做完了,也贴一段玩玩(其实是原来写的那个10位数的,稍做修改)- @echo off & setlocal enabledelayedexpansion
- for /l %%i in (1 1 100) do set num%%i=%%i
- for /l %%i in (1 1 100) do (
- set /a rnd=100!random:~-2!%%100+1,var=!num%%i!
- call set num%%i=%%num!rnd!%%
- set num!rnd!=!var!
- )
- for /l %%i in (1 1 100) do echo %%i=!num%%i!
- 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楼更新后的代码,出现重复现象,见附件。
代码仍未十分看懂,就象绕口令,绕的我有点头晕,暂时不知道出错原因,有空再研究。
错误应该是随机数,随机数重复时应该会出错。
测试代码如下:
:- @echo off & setlocal enabledelayedexpansion
- for /l %%i in (1 1 100) do set num%%i=%%i
- for /l %%i in (1 1 100) do (
- set /a rnd=100!random:~-2!%%100+1,var=!num%%i!
- call set num%%i=%%num!rnd!%%
- set num!rnd!=!var!
- )
- for /l %%i in (1 1 100) do if "%%i"=="!num%%i!" echo %%i=!num%%i!
- pause
复制代码
[attach]72[/attach]
作者: youxi01 时间: 2008-1-16 10:01 标题: 回复 22# 的帖子
哦?
他没要求变量名不能等于 其对应的值 吧?!
作者: netbenton 时间: 2009-5-3 00:58
- @echo off & setlocal enabledelayedexpansion
- for /l %%i in (1 1 100) do set num%%i=%%i
- for /l %%i in (100 -1 1) do (
- set /a rnd=!random!%%%%i+1,n+=1
- for %%a in (!rnd!) do echo !n!=!num%%a!&set/a num!rnd!=num%%i
- )
- pause>nul
复制代码
作者: dahual 时间: 2009-9-20 13:00
- @echo off & setlocal enabledelayedexpansion
- for /l %%a in (1,1,100) do set ".!random!-%%a=%%a"
- for /f "tokens=2 delims==" %%a in ('set .') do set /p=%%a<nul & echo.
- pause>nul
复制代码
看来的,请大家给解释下,谢谢。
作者: liuchong.net 时间: 2009-9-20 14:07
先排序,然后检测相邻的数字是否相同不就得了?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |