Board logo

标题: 出给新手的题(加分题) [打印本页]

作者: bat-zw     时间: 2008-7-20 10:01    标题: 出给新手的题(加分题)
随机生成互不相同的100个0-99的数字,唯一要求代码要高效。 [ Last edited by zw19750516 on 2008-7-20 at 10:06 AM ]

作者: obsolete     时间: 2008-7-20 11:47
试试 @echo off setlocal enabledelayedexpansion for /l %%i in (0,1,99) do set cell_%%i=%%i set last=99 :loop set /a mod=%last%+1 if %mod%==0 goto :pause set /a index=%random% %% %mod% echo !cell_%index%! set cell_%index%=!cell_%last%! set /a last=%last%-1 goto :loop :pause pause [ Last edited by obsolete on 2008-7-20 at 11:52 AM ]

作者: bat-zw     时间: 2008-7-20 14:04
修改一下:
@echo off
for /l %%i in (0,1,99) do set cell_%%i=%%i
set last=100
:loop
set /a index=%random%%%%last%
call,echo %%cell_%index%%%
if %last% neq 100 call,set "cell_%index%=%%cell_%last%%%"
set /a last-=1
if %last% neq 1 goto :loop
pause>nul
[ Last edited by zw19750516 on 2008-7-20 at 02:18 PM ]

作者: obsolete     时间: 2008-7-20 14:25
Originally posted by zw19750516 at 2008-7-20 14:04: 修改一下: [code] @echo off for /l %%i in (0,1,99) do set cell_%%i=%%i set last=100 :loop set /a index=%random%%%%last% call,echo %%cell_%index%%% if %last% neq 100 call,set "cell_% ...
学习了

作者: 523066680     时间: 2008-7-20 15:10    标题: 看我多直接
-----%time%的后面两个数变的好快,应该能当作随机的吧 echo %time:~9,2% 让我给一个进步的题目吧:取100个随机数字 注意哦:如果一路echo %time:~9,2%给出的话,就会是有序的了, 等有几个人回贴后,我就会公布我个人的思路了(搞不好会和大家一样哦) [ Last edited by 523066680 on 2008-7-20 at 03:23 PM ]

作者: moniuming     时间: 2008-7-20 15:39
我也来凑热闹:
@echo off for /l %%a in (1 1 100) do call :echo_ echo.&pause&goto :eof :echo_ set /a "mo=%random%%%100" if defined %mo% goto :echo_ set /a n+=1 set /p=%mo% <nul set "%mo%=niuming"

作者: 523066680     时间: 2008-7-20 15:46    标题: ^^
羡慕!!!今天遇到高人了!!!大家抓住他们 !有问题要一起问哈!! ------基本看不出啊!一个头两个大-------- (好一部分我都没看懂啊,不过想想 我的短一些!!高兴!!) 哼!看我的!!刚改过 速度很慢 想快点关的话 记得ctrl+c,直接关很卡的 随机性也不大好 @echo off&setlocal enabledelayedexpansion for /l %%a in (1,1,100) do ( for /l %%b in (1,1,%time:~10,1%) do (ping -n>nul) echo !time:~9,2! ) pause 我的思路好象靠不住哦 [ Last edited by 523066680 on 2008-7-20 at 04:10 PM ]

作者: 523066680     时间: 2008-7-21 07:34
其他会员也要多想想不同思路滴! 我发现最近大家发的贴 只要有一个人发出 解决方案后 帖子就慢慢沉了,大家要勇于创新啊!

作者: qzwqzw     时间: 2008-7-21 11:52
随机交换的老算法讨论过很多次 代码也写了一大堆 在这就不提了 另外出一个新算法 原始构思来自一个mp3随机播放列表问题的讨论 跟2、3楼的比较接近 不过要简单多了
@echo off & setlocal
for /l %%i in (0,1,99) do call set #%%random%%%%random%%%%random%%=%%i
for /f "tokens=2 delims==" %%s in ('set #') do echo %%s
变量延迟版
@echo off & setlocal EnableDelayedExpansion
for /l %%i in (0,1,99) do set #!random!!random!!random!=%%i
for /f "tokens=2 delims==" %%s in ('set #') do echo.%%s
[ Last edited by qzwqzw on 2008-7-21 at 12:01 PM ]

作者: qzwqzw     时间: 2008-7-21 15:18
将数量级设置到0~10000 挑战性便增强很多了! 将3楼代码数量级改为10000 输出重定向到文本文件 测试花了不到5分钟 而且结果出现了偏差 少了两个数658、5560 重复了一个数5785 [ Last edited by qzwqzw on 2008-7-21 at 03:41 PM ]

作者: bat-zw     时间: 2008-7-21 15:23
这两天老总来检查,差点没累死人:
@echo off&setlocal enabledelayedexpansion
for /l %%i in (0,1,99) do set .%%i=%%i
for /l %%i in (0,1,99) do (
    set /a a=!random!%%100
    call,set b=%%.!a!%%
    set .!a!=!.%%i!
    set .%%i=!b!
)
set .
pause>nul

作者: bat-zw     时间: 2008-7-21 15:26
Originally posted by qzwqzw at 2008-7-21 11:52: 随机交换的老算法讨论过很多次 代码也写了一大堆 在这就不提了 另外出一个新算法 原始构思来自一个mp3随机播放列表问题的讨论 跟2、3楼的比 ...
虽然不是新手了,但为兄的思路所赞叹,所以加分。

作者: 523066680     时间: 2008-7-21 15:41
我的思路居然没人看…………………………………… 不过我觉得如果说只要一个随机数的话 echo %time:~9,2% 是最简便的 [ Last edited by 523066680 on 2008-7-21 at 03:44 PM ]

作者: bat-zw     时间: 2008-7-21 15:55
Originally posted by qzwqzw at 2008-7-21 15:18: 将数量级设置到0~10000 挑战性便增强很多了! 将3楼代码数量级改为10000 输出重定向到文本文件 测试花了不到5分钟 而且结果出现了偏差 少了两个 ...
我三楼的仅是对二楼的修改,但代码从理论上应该是没问题的,为什么会出现错误还有待详细分析。

作者: bat-zw     时间: 2008-7-21 15:59
Originally posted by 523066680 at 2008-7-21 15:41: 我的思路居然没人看……………………………………:( 不过我觉得如果说只要一个随机数的话 echo %time:~9,2% 是最简便的 [ Last edited by 523066680 on 2008-7-21 at 03:44 PM ]
这种方法是存在很大局限性的(如要显示一个在0-999内的随机数呢),同时要直接产生一个在0-99内的随机数就set /a a=%random%%%100就可以了啊。

作者: qzwqzw     时间: 2008-7-21 17:48
3楼代码的问题在与边界定义问题 第一次执行:loop时 假设index获得99 则输出99 last减为99 第二轮loop: 假设index=rnd % 99得1 则输出1 在if句因为last=99<>100 则cell_1=99 (此处已经出错!) last减为98 第三轮loop index=rnd % 98 假设再得1 输出%cell_1% 此时错误彻底暴露 99被重复输出

作者: qzwqzw     时间: 2008-7-21 18:23
修正后的代码
@echo off
for /l %%i in (0,1,9999) do set cell_%%i=%%i
set last=10000

:loop
set /a index=%random% %% %last%
set /a last-=1
call echo %%cell_%index%%% >>4l.txt
call set "cell_%index%=%%cell_%last%%%"
if %last% gtr 0 goto :loop
pause>nul

作者: obsolete     时间: 2008-7-21 20:46
学习~几个算法都是线性的,取决于系数,也就是获取每个数值的时间。 PS:请教,我觉得每次都输出到文件应该会严重影响结果,毕竟IO操作是最费时间的,发现事实并不是这样。 [ Last edited by obsolete on 2008-7-21 at 09:17 PM ]

作者: obsolete     时间: 2008-7-21 21:13
Originally posted by zw19750516 at 2008-7-21 15:23: 这两天老总来检查,差点没累死人: [code] @echo off&setlocal enabledelayedexpansion for /l %%i in (0,1,99) do set .%%i=%%i for /l %%i in (0,1,99) do ( set /a a=!random!%% ...
看懂了 [ Last edited by obsolete on 2008-7-21 at 09:24 PM ]