Board logo

标题: [数值计算] [已解决]批处理如何根据random生成的随机数获取生成时间点? [打印本页]

作者: ads350668398    时间: 2016-10-26 05:22     标题: [已解决]批处理如何根据random生成的随机数获取生成时间点?

【假随机】随机到特定数的方法:
知道了了系统的随机变量是有规律的随机后 逆算怎么算啊?
例如:取系统变量0到9随机
      随机到s要在那个时间点上?有几个时间点?
s=0 1 2 3...9
作者: wskwfkbdn    时间: 2016-10-26 10:30

随机数确实是有规律的,只有使用for循环进行变异,别无他法,如果第三方则很简单搞出来。
作者: huyou96    时间: 2016-10-26 10:43

回复 1# ads350668398

TestRandom.bat
  1. @echo off
  2. for /f "delims=" %%r in ('echo %Random%') do set currandom=%%r
  3. for /f "delims=" %%t in ('echo %Time%') do set curtime=%%t
  4. if %currandom% leq 9 echo Get %currandom% at %curtime%
复制代码

作者: ads350668398    时间: 2016-10-26 12:25

echo off & setlocal enabledelayedexpansion
setlocal enabledelayedexpansion
title 随机数定位
set /p abc=输入要得到的数值
set a=1
set b=99
set /a c=!b!-!a!+1
for /l %%i in (1,1,100) do (
set /a d=!random!%%!c!+!a!
echo.
echo !d!==%abc% %time% >>1-99.txt
)
pause
看见
楼上大神很有启发输出结果 不对啊
例如我想要随机到 1的时候 输出一个时间
作者: ads350668398    时间: 2016-10-26 13:01

echo off & setlocal enabledelayedexpansion
setlocal enabledelayedexpansion
title 随机数定位
set /p abc=输入要得到的数值
set a=1
set b=99
set /a c=!b!-!a!+1
for /l %%i in (1,1,100) do (
set /a d=!random!%%!c!+!a!
echo.
if /i !d!==%abc%%time%>>1-99.txt
)
pause

傻情况什么都没有了输出 累了
作者: wskwfkbdn    时间: 2016-10-26 13:06

反正挺蛋疼的,我是放弃了这个功能
作者: ads350668398    时间: 2016-10-26 13:12

我大算高仿真随机数
作者: wskwfkbdn    时间: 2016-10-26 14:02

回复 7# ads350668398

何必这么麻烦
作者: Bella    时间: 2016-10-26 14:04

本帖最后由 Bella 于 2016-10-26 14:15 编辑

你这是要搞事情, 伪随机大多是用时间做种子
来一发真随机, 鼠标怎么有点抖


作者: aa77dd@163.com    时间: 2016-10-26 14:17

本帖最后由 aa77dd@163.com 于 2016-10-26 14:26 编辑

如果一个伪随机函数以时间 t 为自变量, 尽管这个函数算法上是精确的, 如果能知道运行时的 t , 就能确定给出它的结果值, 这一点上确实是所谓 "伪" 随机了.

然而, 问题的关键是, 每次运行这个函数时, 各种不确定因素让你无法确定自变量 t 将会是什么值, 那么这个伪随机函数最终就仍然生成了一个真的随机数.

换言之, 任何精确的伪随机函数, 只要在运行过程中与任何一种不确定的因素相关, 它就会生成真的随机数.

CMD 最简单的方式, 直接取时间的百分秒值, 随机数范围 [0..9]
  1. echo;%time:~-1%
复制代码

作者: Bella    时间: 2016-10-26 14:25

本帖最后由 Bella 于 2016-10-26 15:09 编辑

回复 10# aa77dd@163.com

大师真知灼见
真随机最简单的就是用 两次按键间隔 做种子
作者: wskwfkbdn    时间: 2016-10-26 14:34

回复 9# Bella


    这个玩意都能拿出手  牛
作者: huyou96    时间: 2016-10-26 14:43

本帖最后由 huyou96 于 2016-10-26 15:39 编辑

回复 4# ads350668398

TestRandom.bat
  1. @echo off
  2. rem 操作系统自带的动态环境变量(dynamic environment variables)之%Random%会随机生成0至32767的随机数
  3. rem 从该随机产生的结果中获取从0到9的随机数并列印产生该随机数的时间
  4. rem 一旦有符合条件结果产生就终结退出批处理脚本
  5. rem 如果想生成正好等于1的随机数并获取生成1的时间,请使用下面“::”所注释的那条语句
  6. rem 不过可能无法在短时间内产生想要的结果……也许跑上个把钟头也不会生成正好等于1的随机数呢……
  7. :Beginning
  8. echo Please waiting...
  9. for /f "delims=" %%r in ('echo %Random%') do set currandom=%%r
  10. for /f "delims=" %%t in ('echo %Time%') do set curtime=%%t
  11. echo %currandom%
  12. :: if %currandom% equ 1 echo Get %currandom% at %curtime% && goto End
  13. if %currandom% leq 9 echo Get %currandom% at %curtime% && goto End
  14. if %ErrorLevel% equ 0 goto Beginning
  15. :End
复制代码
得到4的结果:

Please waiting...
15711
Please waiting...
26034
Please waiting...
8819
Please waiting...
15731
Please waiting...
24923
Please waiting...
7385
Please waiting...
8941
Please waiting...
7286
Please waiting...
11328
Please waiting...
26791
Please waiting...
3409
Please waiting...
31267
Please waiting...
10729
Please waiting...
25560
Please waiting...
5750
Please waiting...
26825
Please waiting...
20732
Please waiting...
25038
Please waiting...
24140
Please waiting...
31330
Please waiting...
22044
Please waiting...
17643
Please waiting...
31927
Please waiting...
27158
Please waiting...
16224
Please waiting...
5183
Please waiting...
20638
Please waiting...
32513
Please waiting...
19460
Please waiting...
5219
Please waiting...
17727
Please waiting...
3126
Please waiting...
1119
Please waiting...
26532
Please waiting...
453
Please waiting...
12804
Please waiting...
1557
Please waiting...
31076
Please waiting...
14108
Please waiting...
17528
Please waiting...
24718
Please waiting...
14526
Please waiting...
4
Get 4 at 14:27:29.51

(在下午14点27分29秒51这个时间得到了4这个随机数)
作者: huyou96    时间: 2016-10-26 14:58

回复 10# aa77dd@163.com

讃!

學習學習。
作者: aa77dd@163.com    时间: 2016-10-26 15:03

回复 11# Bella

键盘用手敲, 手是人类这种生物的一部分, 人就是一个真随机函数发生器. 另外, 比如: 某一瞬间的内存占用, 磁盘空间占用, 网络延时, ... 这些都是真的随机信息
作者: 523066680    时间: 2016-10-26 15:11

本帖最后由 523066680 于 2016-10-26 15:18 编辑

? 好像有种方法是通过某种联网设备获取空气中的噪声信息
作者: aa77dd@163.com    时间: 2016-10-26 15:16

本帖最后由 aa77dd@163.com 于 2016-10-26 15:23 编辑

回复 16# 523066680

任何电脑有一个高灵敏度的麦克风就行了吧

随机的信息 无处不在, 一点都不难获得

随机数种子是为了固定获取一个通过某种伪随机函数生成的一个序列

任何信息不能精确预知, 相对而言, 它就是随机的信息了.

如果有一个无所不知, 无所不能的超然存在, 那么一切对于这个超然的存在都将能精确预知, 那么一切都是 "伪" 随机了.

扯远了, 已经扯到哲学了, 不继续了
作者: huyou96    时间: 2016-10-26 15:24

回复 17# aa77dd@163.com

15楼&17楼,领教领教!哲学上的感悟就是高大上,实在发人深省啊!
……,可惜我等芸芸众生的俗男俗女们大多懵懵懂懂在过活……,根本领悟不到这些深藏日常中的哲理哇……
作者: 523066680    时间: 2016-10-26 15:24

本帖最后由 523066680 于 2016-10-26 15:51 编辑

chaos

杰森斯坦森有部同名电影


作者: aa77dd@163.com    时间: 2016-10-26 15:38

回复 19# 523066680

发现是看过的, 也发现不知道英文片名是这么 deep 的一个词
作者: ads350668398    时间: 2016-10-26 16:53

本帖最后由 ads350668398 于 2016-10-26 16:57 编辑

回复 13# huyou96


    数值可以设置在0到999么
我试着改动 但是没有成功 谢谢  晕
另外看下窝 的拿里错了

echo off & setlocal enabledelayedexpansion
setlocal enabledelayedexpansion
title 随机数定位
set /p abc=输入要得到的数值
set a=1
set b=99
set /a c=!b!-!a!+1
for /l %%i in (1,1,100) do (
set /a d=!random!%%!c!+!a!
echo.
if /i !d!==%abc%%time%>>1-99.txt
)
pause
作者: ads350668398    时间: 2016-10-26 17:08

本帖最后由 ads350668398 于 2016-10-26 17:15 编辑

我的一直错误所以。。请勿在扣分了晕
为什么 我的问题都要绕弯路 获得解决呢 答案对 是次要的 要成长我要的过程
例如今天我凑来的代码 看思路也能解决但是。。没人看
直接1+1=2
学无止境啊
作者: ads350668398    时间: 2016-10-28 07:03

回复  ads350668398

TestRandom.bat得到4的结果:

Please waiting...
15711
Please waiting...
2 ...
huyou96 发表于 2016-10-26 14:43



    echo off
setlocal enabledelayedexpansion
set aa=1 2 3 4 5 6 7 8 9
set aa=%aa%
:Beginning
echo Please waiting...
for /f "delims=" %%r in ('echo %!aa!%') do set currandom=%%r
for /f "delims=" %%t in ('echo %Time%') do set curtime=%%t
echo %currandom%>>1ddd.txt
if %currandom% equ 1 echo Get %currandom% at %curtime% && goto end

::if %currandom% leq 9 echo Get %currandom% at %curtime% && goto End
if %ErrorLevel% equ 0 goto Beginning

:End
)

系统随机变量修改为什么不成功 显示ECHO 处于打开状态。
作者: happy886rr    时间: 2016-10-28 09:28

本帖最后由 happy886rr 于 2016-10-28 09:31 编辑

回复 23# ads350668398
标题: 批处理技术内幕:随机数%RANDOM%
链接: http://demon.tw/reverse/cmd-internal-random.html
cmd家的都是这么算的,
((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
虽然随机性很糟糕,但快。模拟真随机需要矩阵转置算法加RAS映射变换,但速度非常缓慢。
作者: 523066680    时间: 2016-10-28 09:42

本帖最后由 523066680 于 2016-10-28 10:08 编辑
  1. #include <stdio.h>
  2. #include <omp.h>
  3. int main(int argc, char *argv[] )
  4. {
  5.     #pragma omp parallel num_threads(100)
  6.     {
  7.         printf("Thread %d\n", omp_get_thread_num() );
  8.     }
  9.     return 0;
  10. }
复制代码
输出0-99不重复,随机强度不大  (逃
作者: ads350668398    时间: 2016-10-28 13:32

回复 24# happy886rr


    这个以前看过
还是帮我看看下上面那里错勿了啊 谢谢
作者: ads350668398    时间: 2016-10-28 13:36

回复 25# 523066680


    这个是批处理么 怎么运行?
请帮忙看下我在 21   23楼是错误的地方 谢
作者: 523066680    时间: 2016-10-28 15:01

本帖最后由 523066680 于 2016-10-28 15:10 编辑

回复 27# ads350668398

    从你的代码看感觉基本功不扎实有些走火入魔。

  1.     echo off
  2. setlocal enabledelayedexpansion
  3. set aa=1 2 3 4 5 6 7 8 9
  4. set aa=%aa%
  5. :Beginning
  6. echo Please waiting...
  7. for /f "delims=" %%r in ('echo %!aa!%') do set currandom=%%r
  8. for /f "delims=" %%t in ('echo %Time%') do set curtime=%%t
  9. echo %currandom%>>1ddd.txt
  10. if %currandom% equ 1 echo Get %currandom% at %curtime% && goto end
  11. ::if %currandom% leq 9 echo Get %currandom% at %curtime% && goto End
  12. if %ErrorLevel% equ 0 goto Beginning
  13. :End
  14. )
复制代码


问题:
1. echo off 前面的空格是干嘛的? 一般都是 @echo off
2. 为什么 set aa=%aa% set完之后 aa 不还是原来的样子么?
3. echo %!aa!% 要干嘛?
4. 最后多出来的右括号是怎么回事?

建议:
1. 可以再看一些论坛的实例。一定要看风格好的,乱的别看。
2. 推荐学ruby
作者: ads350668398    时间: 2016-10-28 17:05

回复 28# 523066680

@echo off
setlocal enabledelayedexpansion
set aa=1 2 3 4 5 6 7 8 9
:Beginning
echo Please waiting...
for /f "delims=" %%r in ('echo %aa%') do set currandom=%%r
for /f "delims=" %%t in ('echo %Time%') do set curtime=%%t
echo %currandom%>>1ddd.txt
if %currandom% equ 1 echo Get %currandom% at %curtime% && goto end
::if %currandom% leq 9 echo Get %currandom% at %curtime% && goto End
if %ErrorLevel% equ 0 goto Beginning
:End

不好意思 上面的确 谢谢 指点
这样都做了还是不行 为啥 了晕
作者: 523066680    时间: 2016-10-28 17:12

本帖最后由 523066680 于 2016-10-28 17:21 编辑

回复 29# ads350668398


    该批处理中的坑太多(逃
作者: ads350668398    时间: 2016-10-28 17:35

回复 30# 523066680


    21楼 怎么也不能错那里了啊晕
作者: /zhqsystem/zhq    时间: 2016-10-29 01:31

最接近随机数时间点的代码应该是这个
  1. for /f "delims=" %%r in ('cmd.exe /c echo,%Random%^| wmic.exe path Win32_Process where name^="cmd.exe" get CommandLine^,CreationDate /format:list')do (
  2. echo,%%r
  3. )
复制代码

作者: ads350668398    时间: 2016-10-29 10:34

马上出赖了 都要给点 困难 这个是咋回事啊 晕菜中
作者: ShenMian    时间: 2016-11-14 21:39

看的是生成的耗时
作者: ShenMian    时间: 2016-11-14 21:40

看的是生成的时间,并没有所谓的"真随机"




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2