中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 20:56
楼 主 随机显示5个不同的数 发表于 2007-01-04 16:12 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
能不能一次显示出1-100随机的5位数,并且不能有重复的.
想了很久,也搜索了论坛里的大部分帖子,好像都没有同时显示5位数的,关键是还要不能重复,


不好意识,对不起各位了,看来我的表达能力确实有问题.
我的目的是 显示1-100的随机数, 一次同时显示5个 , 并且显示的这5个数不能有重复的.这样说大家能理解了吗?


首先多谢各位的精彩答复,因本人的批处理水平实在太菜,有些高深的答复不太看的懂,所以若有错误的评价还请见谅.....................
1, 6楼的答复基本符号要求,但多次使用时偶而会出现死循环现象,不知什么原因.
2, 13楼的虽没有重复现象,但每次运行后的第一位数总是相同,总觉略有不妥之处.
3, 26楼的虽然也可用,但是觉得过于呆板,(对不起,可能用词不当,但想不出更婉转的词了,见谅!)比如我想显示6位或7,8,9..........位就太麻烦了,其实我的本意是先要求输入随机数的最大值,再输入显示的位数.
4, 个人感觉(从思路上来说)32楼的应该是最理想的,但可惜我看不懂,而32楼的这位兄弟又没把代码按要求写完,(一次显示了100个).
5, 我认为33楼的代码应该是最好的了,从代码上看,应该是绝对没重复,而且很灵活,只是不知道会不会出现他们说的效率低,和死循环.目前运行状况良好.size]

不好意识 版主 经反复测试,你6楼的方法没问题,只是会出现死循环,可能是测试的方法太多了,搞错了对象,对不起了. 在42楼修改后的方法我认为以接近完美,真是条条大路通罗马,好方法太多了,批处理真是对人思路的挑战.

[ Last edited by 26933062 on 2007-1-6 at 10:07 PM ]
2 发表于 2007-01-04 20:42 ·  中国 河南 郑州 电信
中级用户
★★
积分 439
发帖 170
注册 2006-01-09 20:29
UID 48707
状态 离线
5个?5位?
1-100 有5位
bat c c++
3 发表于 2007-01-04 22:17 ·  中国 广西 南宁 联通
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
UID 44210
状态 离线
5随机个1-99

1:
@echo off
:loop
cls
set random1=%random:~-2%

:loop2
set random2=%random:~-2%
if "%random2%" == "%random1%" goto loop2

:loop3
set random3=%random:~-2%
if "%random3%" == "%random1%" goto loop3
if "%random3%" == "%random2%" goto loop3

:loop4
set random4=%random:~-2%
if "%random4%" == "%random1%" goto loop4
if "%random4%" == "%random2%" goto loop4
if "%random4%" == "%random3%" goto loop4

:loop5
set random5=%random:~-2%
if "%random5%" == "%random1%" goto loop5
if "%random5%" == "%random2%" goto loop5
if "%random5%" == "%random3%" goto loop5
if "%random5%" == "%random4%" goto loop5

echo %random1% %random2% %random3% %random4% %random5%
pause
goto loop


2:
@echo off
:Start
cls
call :loop 1
call :loop 2
call :loop 3
call :loop 4
call :loop 5

echo %random1% %random2% %random3% %random4% %random5%
pause
set Tmp_=
goto :Start

:loop
set randomloop=%random:~-2%
for %%n in (%Tmp_%) do if "%randomloop%" == "%%n" goto loop
set random%1=%randomloop%
call set Tmp_=%%Tmp_%% %randomloop%
goto :eof


[ Last edited by zh159 on 2007-1-4 at 10:09 AM ]
4 发表于 2007-01-04 23:45 ·  中国 广东 清远 联通
高级用户
★★
积分 846
发帖 247
注册 2006-10-27 12:03
UID 68504
性别 男
来自 湖南==》广东
状态 离线
来凑个“热闹”

@echo off
setlocal enabledelayedexpansion
set /a a=1

:test
set /a _num!a!=%random:~-2%
if not defined !_num%a%! set /a a+=1
if !a! LSS 6 goto :test

echo %_num1% %_num2% %_num3% %_num4% %_num5%

pause>nul
5 发表于 2007-01-05 01:52 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  楼主的表达有问题,看了半天还不知道究竟是要生成1-99个不同的随机5位数还是在1-99中随机显示5个不同的数,请楼主表达清楚。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
6 发表于 2007-01-05 02:16 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  看了4楼的代码,推测 youxi01 的本意是想显示5个 1-100 之间(不包含100)不同的随机数,但是代码是有问题的:%a% 是 1-5 的数,用 if not defined 来判断 num%a% 这个变量是否被定义过,执行的结果始终是没有定义过。

  按照4楼的思路修改代码如下:

@echo off
set count=0

:loop
set /a num=%random%%%99+1
if not defined num%num% (
set num%num%=%num%
set /a count+=1
call echo %%num%%
)
if %count% lss 5 goto loop

pause>nul

——————————————————————————————————————
  如果循环调用这段代码,在第20次的时候会陷入死循环,具体情况请看16楼的描述,原因分析请看41楼,解决问题的代码请看42楼。

[ Last edited by namejm on 2007-1-6 at 05:03 PM ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
7 发表于 2007-01-05 03:05 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
UID 72412
性别 男
状态 离线
怀疑自己的理解能力和楼主表达能力

是5个 还是5位? 5个 1-100 如下:


@ECHO %dbg% OFF
setlocal ENABLEDELAYEDEXPANSION

FOR /L %%A IN (1,1,5) DO ECHO !RANDOM:~-2!
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
8 发表于 2007-01-05 03:33 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  发现很多人都忽略了这样一个细节:%random:~-2% 有可能取到 00 这样的字符串,set /a num=%random:~-2% 虽然可以把 00 字符串数值化,变成0,但是,0却并不是楼主所想要的。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
9 发表于 2007-01-05 04:30 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
UID 72412
性别 男
状态 离线
那OK,
%random:~-2%不行就%random:~0,2%

保证前面没0


@ECHO %dbg% OFF
setlocal ENABLEDELAYEDEXPANSION

FOR /L %%A IN (1,1,5) DO ECHO !RANDOM:~0,2!
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
10 发表于 2007-01-05 04:36 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
取得的5个数中有相同的算不算?
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
11 发表于 2007-01-05 04:41 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  按照楼主的说法,5个数中不能出现相同的数。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
12 发表于 2007-01-05 04:43 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
目前9楼的已发现有这种情况。
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
13 发表于 2007-01-05 06:18 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
UID 72412
性别 男
状态 离线
OK!!!嵌套递归! 这下不重复了吧???呵呵

@ECHO %dbg% OFF
setlocal ENABLEDELAYEDEXPANSION
SET T=1

:PR
FOR /L %%A IN (%T%,1,5) DO (SET NO%%A=!RANDOM:~0,2! & SET /A H=%%A-1 & IF !H! GTR -1 (
FOR /L %%B IN (!H!,-1,1) DO (IF !NO%%A!==!NO%%B! (SET T=%%A & CALL :PR !T! & GOTO :EOF)))&ECHO !NO%%A!)



[ Last edited by tghksj on 2007-1-4 at 06:11 PM ]
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
14 发表于 2007-01-05 06:44 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
UID 72412
性别 男
状态 离线
我晕~~我傻了,怎么没想起 if not defined
晕晕晕晕晕晕晕晕晕晕晕晕晕晕晕


@ECHO %dbg% OFF
setlocal ENABLEDELAYEDEXPANSION
CLS
SET T=1

:PR
FOR /L %%A IN (%T%,1,5) DO (
SET NO%%A=!RANDOM:~0,2!
IF DEFINED !NO%%A! (SET T=!%%A! & GOTO :PR)
ECHO !NO%%A!
)


咦?????????不好使?????????????还是有重复的??!
高人解释下..............

暂时只有13楼可以了....

[ Last edited by tghksj on 2007-1-4 at 05:53 PM ]
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
15 发表于 2007-01-05 06:58 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  看了14楼的代码,发现里面并没有控制随机数是否重复的语句,多测试几次之后,就会发现有重复数值出现,建议参考一下我在6楼帖出来的代码。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
论坛跳转: