中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 难题..将可能出现任意相同五个数字按要求错开
作者:
标题: 难题..将可能出现任意相同五个数字按要求错开 上一主题 | 下一主题
zerocq
中级用户




积分 458
发帖 196
注册 2006-10-5
状态 离线
『楼 主』:  难题..将可能出现任意相同五个数字按要求错开

五个0-9的数字,可能出现任意相同数字,分别放入A,B,C,D,E变量中

每次最少选取三个变量将变量中的数字+1

目标是让五个变量中的数字全部不相同



2008-3-15 18:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zerocq
中级用户




积分 458
发帖 196
注册 2006-10-5
状态 离线
『第 2 楼』:  

给点思路也可以,vbs/bat不限

谢谢各位

2008-3-15 18:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 3 楼』:  

你的目的是让5个数不同。你生成的时候就和前面去比较有没有,没有就保存……


你那种取3加1什么的根本不能保证得到你要的结果。

2008-3-15 18:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  

在批处理版块讨论这种纯算法的问题是不是有点...

2008-3-16 02:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 5 楼』:  

这个能显示五个不同的数字
@echo off
setlocal enabledelayedexpansion
:begin
set ac=0
:again
type nul>"%temp%\temp1.txt"
type nul>"%temp%\temp2.txt"
set aa=0
set/a ac+=1
:aaa
set/a ab=%random%%%10
for %%a in (!ab!) do (
set/a aa+=1
>>"%temp%\temp1.txt" echo %%a
if !aa!==5 goto aab
goto aaa
)
:aab
for /f "delims=" %%i in ('type "%temp%\temp1.txt"') do (
if not !%%i!==!ac! (
>>"%temp%\temp2.txt" echo %%i
set %%i=!ac!
)
)
for /f "delims=:" %%b in ('type "%temp%\temp2.txt"^|findstr /n .*') do set ad=%%b
if not !ad!==5 goto again
for /f "delims=" %%d in ('type "%temp%\temp2.txt"') do (
echo %%d
)
pause&cls
goto begin


2008-3-17 17:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wxcute
中级用户





积分 458
发帖 211
注册 2006-7-26
状态 离线
『第 6 楼』:  这不跟我的猜数字中生成4个不同随机数很像

我很菜,只提供思路,按这个思路应该也可以搞定
@echo off
:begin
cls
::生成五个不同随机数
set/a n1=%random%%%10
:nn2
set/a n2=%random%%%10
if %n2%==%n1% goto :nn2
:nn3
set/a n3=%random%%%10
if %n3%==%n2% goto :nn3
if %n3%==%n1% goto :nn3
:nn4
set/a n4=%random%%%10
if %n4%==%n3% goto :nn4
if %n4%==%n2% goto :nn4
if %n4%==%n1% goto :nn4
:nn5
set/a n5=%random%%%10
if %n5%==%n4% goto :nn5
if %n5%==%n3% goto :nn5
if %n5%==%n2% goto :nn5
if %n5%==%n1% goto :nn5
set nn=%n1%%n2%%n3%%n4%%n5%

echo %nn%
pause
goto begin




┌───────┐
├→学习→实践→┤
└───────┘
2008-3-17 20:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 7 楼』:  

@echo off
set str=0123456789
    for %%i in (A B C D E) do call :loop %%i
    echo 取得的结果是%a% %b% %c% %d% %e%
pause
:loop
set/a s=%random%%%9
   if defined %s% goto loop
       call set %1=%%str:~%s%,1%%&set %s%=A



简单!简单!再简单!
2008-3-18 02:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 8 楼』:  

在这了讨论纯算法有什么问题吗?
难道4楼的兄弟认为批处理就没有算法的应用吗?

只是以前已经讨论过的问题又开始讨论
而且又回到了初始讨论的阶段
似乎很多人都不喜欢搜索和拿来


获取互不相同的随机数
通常有两类算法

一类是循环探测算法
就像6楼和7楼提到的
随机取一个数
检查以前是否取过
是则再次随机取
否则赋给变量
这类算法最大的弊病在于
如果取值个数接近取值范围
则命中率将明显降低
比如在0~100中取100个互不相同的数
此类算法的效率将相当低

现在比较成熟且高效的算法应该是随机交换算法
也就是先生成一个顺序数列
然后依次对数列中的数进行随机交换
用多少个数就交换多少次
交换完成后
直接依次取数列前端的数即可

5楼的代码
可能是不熟悉批处理中的数列操作
而选用了echo+findstr的方式处理数列
看上去不太舒服
所以没有细究其中的算法

6楼的代码重复性较大
应该是对批处理中的循环应用还不是熟练

7楼的代码
set/a s=%random%%%9
似乎应该是
set/a s=%random%%%10

[ Last edited by qzwqzw on 2008-3-18 at 02:17 PM ]

2008-3-18 14:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 9 楼』:  

显示5个不重复的随机数,确实是讨论过的。关键是要避开重复。

方法一、
:
@echo off
set var=0 1 2 3 4 5 6 7 8 9
if "%~1"=="" (
  for /f "tokens=1,2 delims= " %%i in ('"%~0" n^|sort') do call set w=%%w%% %%j
) else (
  for %%a in (%var%) do call echo %%random%% %%a
  goto :eof
)
for /f "tokens=1-5" %%a in ("%w%") do echo %%a %%b %%c %%d %%e
pause
方法二、
:
@echo off
set var=0 1 2 3 4 5 6 7 8 9
for /l %%a in (10 -1 6) do call :lis %%a
echo %str%
pause&exit
:lis
  set /a w=%random%%%%~1+1
  for /f "tokens=%w%" %%i in ("%var%") do (
    call set var=%%var:%%i=%%
    call set str=%%str%% %%i
)
goto :eof




致精致简!
2008-3-18 18:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zerocq
中级用户




积分 458
发帖 196
注册 2006-10-5
状态 离线
『第 10 楼』:  

问题是非自已生成随机数,是从外部获取的

获取五个数字后再最少选三+1进行错开

2008-3-18 19:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 11 楼』:  这个可以轻松搞定的:


@echo off
set /a a=%random%%%10
echo %a% >a.txt
:set1
set /a b=%random%%%10
find "%b%" a.txt >nul
if errorlevel 1 goto set2
goto set1
:set2
echo %b% >>a.txt
set /a c=%random%%%10
find "%c%" a.txt >nul
if errorlevel 1 goto set3
goto set2
:set3
echo %c% >>a.txt
set /a d=%random%%%10
find "%d%" a.txt >nul
if errorlevel 1 goto set4
goto set3
:set4
echo %d% >>a.txt
set /a e=%random%%%10
find "%e%" a.txt >nul
if errorlevel 1 goto show
goto set4
:show
del a.txt
echo %a%%b%%c%%d%%e%


2008-3-18 19:52
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 12 楼』:  

现在的题目就比较有意思了

11楼的代码仍然不合题意

初步编写了一段代码
根据代码的执行结果
证明限定每个数只加一次1
则必然有些组合无法完成差异化
比如 1 1 2 2 3
:: 将获取的5个数选择其中的一些(至少选取3个,至多选取4个)加1,使他们互不相等
:: qzwqzw@cn-dos.net : 2008-03-19
@echo off & setlocal EnableDelayedExpansion
for /l %%i in (1 1 5) do (
    set /a n=!random! %% 10
    set [%%i]=!n!
)

set /p=生成随机数列:<nul
for /l %%i in (1 1 5) do set/p= ![%%i]!<nul
echo.
echo.
pause>nul

for /l %%i in (1 1 5) do (
    for /l %%j in (%%i 1 5) do (
        if not %%i==%%j (
            set /a a=[%%i], b=[%%j]
            if !a! gtr !b! (
                set [%%i]=!b!
                set [%%j]=!a!
            )
        )
    )
)

set /p=数列排序后为:<nul
for /l %%i in (1 1 5) do set/p= ![%%i]!<nul
echo.
echo.
pause>nul

for /l %%i in (1 1 5) do (
    if defined prev (
        set /a a=[!prev!]
        set /a b=[%%i]
        if !a! geq !b! (
            set /a [%%i]=a+1
            set /a iAdd=a+1-b
            set /a nAdd+=1
            echo 第!nAdd!次:!b![%%i]+!iAdd!
        )
    )
    set prev=%%i
)

set /p=数列差异化后:<nul
for /l %%i in (1 1 5) do set/p= ![%%i]!<nul
echo.
echo.
pause>nul


2008-3-19 18:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: