中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-22 13:58
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 随机显示5个不同的数 查看 6,594 回复 57
31 发表于 2007-01-05 11:10 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
谢谢各位!辛苦了!!!
32 发表于 2007-01-05 12:15 ·  中国 江西 南昌 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
实际上这是一个生成P(m,n)随机数列的问题

当m远大于n时可以采用楼上各位的碰撞式生成

但当n接近m时,碰撞生成效率极低

此时通常采用顺序数列随机排序或者顺序数列随机选取方法

下面是一个P(100,100)的例子,即生成100个互不重复的0~99之间的随机数列


:: 生成0-99之间的随机数列 R1
:: qzwqzw@bbs.cn-dos.net
:: 2007-01-04 23:03
@echo off
setlocal EnableDelayedExpansion

:: 初始化顺序数列
for /l %%i in (0,1,99) do (
set rnum%%i=%%i
)

:: 对数列进行随机交换
for /l %%i in (0,1,99) do (
set /a rnd=!random! %% 100
call set tmp=%%rnum!rnd!%%
set rnum!rnd!=!rnum%%i!
set rnum%%i=!tmp!
)

set rnum
pause
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
namejm +4 2007-01-05 12:25
26933062 +15 2008-07-07 19:24
33 发表于 2007-01-05 12:27 ·  中国 广西 南宁 联通
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
@echo off
:start
cls
set Num=
set Tmp$=

:loop
set /a randomloop=%random%%%99+1
for %%n in (%Tmp$%) do if "%randomloop%" == "%%n" goto loop
call set Tmp$=%%Tmp$%% %randomloop%
set /a Num+=1
set random_%Num%=%randomloop%
if %Num% LSS 5 goto loop

for /l %%n in (1,1,%Num%) do call set /p= %%random_%%n%%<nul
echo.
pause
goto start
exit



可以“echo %Tmp$%”显示,也可以“set random_”显示
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
26933062 +2 2007-01-06 12:29
34 发表于 2007-01-06 01:47 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线

  经过多次测试,发现13楼的代码很怪,结果中的五个数中的第一个数很容易和下一次测试结果中的第一个数相同,不知道是什么原因,可能代码有问题。

  下面是我连续测试五遍的结果:
附件
1111.BMP
35 发表于 2007-01-06 03:42 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
19年会员
UID 72412
性别 男
状态 离线
又是 qzwqzw 我的偶像啊~~

32楼看不懂啊~~~~~我受不了了~你的每个代码我都得看上一两天...

求求你逐句解释一下行吗???妈妈密啊~~~受不了了~~!!!

----------------------------------

34楼你运气好,我这没出现这这样的情况.今天买张彩票试试!!一定中!!!!!:)

[ Last edited by tghksj on 2007-1-5 at 03:01 PM ]
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
36 发表于 2007-01-06 04:29 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by tghksj at 2007-1-5 14:42:
又是 qzwqzw 我的偶像啊~~

32楼看不懂啊~~~~~我受不了了~你的每个代码我都得看上一两天...

求求你逐句解释一下行吗???妈妈密啊~~~受不了了~~!!!

--- ...


  晕,这跟运气有什么关系?我今天测试了N遍都是这样的情况。
37 发表于 2007-01-06 09:01 ·  中国 广西 南宁 联通
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
Originally posted by lxmxn at 2007-1-5 12:47:

  经过多次测试,发现13楼的代码很怪,结果中的五个数中的第一个数很容易和下一次测试结果中的第一个数相同,不知道是什么原因,可能代码有问题。

我连试了十多次,间隔几分钟后再试也一样
38 发表于 2007-01-06 10:32 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  要显示1-100这个范围的随机数是极其简单的事情,问题的关键是要排除掉重复的数字,这样就增加了一些工作量。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
39 发表于 2007-01-06 10:50 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
是啊,版主,你6楼的代码,经过多次测试,同样发现了重复的现象.
40 发表于 2007-01-06 12:01 ·  中国 福建 福州 连江县 电信
中级用户
★★
积分 356
发帖 115
注册 2004-07-27 00:00
21年会员
UID 29114
性别 男
状态 离线
个人认为32 楼是唯一正解。先建立符合要求的的所有数码的顺序数列,再对顺序数列随机排列。随意取任意位,一定会同时满足不重复、随机的要求。其它思路,先取若干符合要求随机数码,再判断是否重复,理论上都有死循环的可能。
41 发表于 2007-01-06 12:46 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
Originally posted by 26933062 at 2007-1-5 21:50:
是啊,版主,你6楼的代码,经过多次测试,同样发现了重复的现象.

   不会吧?我已经通过 if not defined 语句来控制变量是否重复来排除重复的值了,从理论上来说是不可能有重复的值出现的,并且,经过我不小于100次的测试,始终没有发现重复值,请问你是如何多次重复测试的?

  另外,在回这个帖子的过程中,突然明白了我在16楼所描述的奇怪现象是怎么造成的:原来,当num%num%从num1到num99这99个变量都被定义之后,第20次的第5个值应该是第100个值了,此时,可被利用的变量名都已经被定义过了,所以,程序只能在 loop 和 goto loop 之间打转转,造成了死循环。应当在适当的地方把所有的变量清空就可以解决16楼所说的奇怪问题了。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
42 发表于 2007-01-06 13:07 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  对6楼的代码稍作修改,使得代码可以重复N次而不会出现16楼所说的现象:

@echo off
:begin
cls
set times=0
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%%
)
set /a times+=1
if %times% equ 20 (
for /l %%i in (1,1,99) do set num%%i=
set times=0
)
if %count% lss 5 goto loop
pause>nul
goto begin
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
43 发表于 2007-01-06 14:02 ·  中国 广东 广州 天河区 电信
高级用户
★★★
潜水修练批处理
积分 788
发帖 366
注册 2006-12-31 02:43
19年会员
UID 75048
性别 男
状态 离线
凑凑热闹也发一个

@echo off
set count=1
set num=
echo %random% >nul
:DORND
set /a rnd=%random%*100/32767+1
echo %num% | find " %rnd% " && goto DORND
set num=%num% %rnd%
set /a count+=1
if %count% lss 6 goto DORND
echo %num%
pause



各位看到第四行可能会觉得奇怪,关于这个请看下面xmxn的提问和我的个人见解

Originally posted by lxmxn at 2007-1-5 12:47 PM:

  经过多次测试,发现13楼的代码很怪,结果中的五个数中的第一个数很容易和下一次测试结果中的第一个数相同,不知道是什么原堮..


这个貌似是产生随机数的方法有问题,直接连续多次运行下面的语句
@echo off
set count=1
:loop
echo %random% & echo.
set /a count+=1
if %count% lss 10 goto loop
pause


这是我们会发现几次连续运行第一个出来的数字大小慢慢地增大,而之后的没有问题,时间间隔长一点第一个数的增幅就大一点,难道这个产生随机数的方法是于时间之类的有联系?随机产生的原数字大小差不多,经过某些运算后得到的结果一样也不为奇了,如果是这样的话,把第一个随机数舍弃或者使用另外一个运算就可以了
44 发表于 2007-01-06 14:25 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by dikex at 2007-1-6 01:02:
凑凑热闹也发一个



各位看到第四行可能会觉得奇怪,关于这个请看下面xmxn的提问和我的个人见解



这个貌似是产生随机数的方法有问题 ...


  这个猜想有点问题吧??

  看下面的代码:按理说来,for命令的执行速度是非常快的,但是下面代码所产生的随机数大小变化却是比较大的,是不是就排除了“随机数的产生和时间有关”这一说?

@echo off&setlocal enabledelayedexpansion
for /l %%a in (1,1,20) do echo !random!
pause
45 发表于 2007-01-06 14:41 ·  中国 广东 广州 天河区 电信
高级用户
★★★
潜水修练批处理
积分 788
发帖 366
注册 2006-12-31 02:43
19年会员
UID 75048
性别 男
状态 离线
嗯,有道理……
又一个猜想出现了^_^
可能时间只是产生时的其中一个参数,还与上一个随机数有关,而上一个经过某些放大差别以及和时间相关的运算后,第二个就是名副其实的随机了
总之%random%产生随机数的方法有点问题,各位使用时注意一下,必要时舍弃第一个随机数

P.S.听过某人说vb产生随机数也是很特殊的,不知和这个是否差不多,猜想……猜想……继续猜想……
论坛跳转: