标题: [日期时间] 批处理如何按指定数量生成在指定时间范围内随机不重复的时间点 [打印本页]
作者: tuquan 时间: 2016-12-1 19:50 标题: 批处理如何按指定数量生成在指定时间范围内随机不重复的时间点
单位签到机坏了,上级单位要求不能中断上报签到信息
求助能生成签到 文件的批处理
求生成 每天4次的签到文本
时间区间分别是:7:30-8:30
11:30-12:30
14:00-14:30
17:30-18:00
要求时间是顺序的 人员出现是随机不重复的
作者: tuquan 时间: 2016-12-1 20:11
本帖最后由 pcl_test 于 2016-12-1 20:26 编辑
在论坛找了一下 人员随机问题可以解决
区间随机时间顺序问题还不知如何下手
http://www.bathome.net/redirect. ... 2814&ptid=20850
作者: pcl_test 时间: 2016-12-1 21:59
本帖最后由 pcl_test 于 2016-12-2 08:55 编辑
上班可提早,下班常延迟,在指定时间段内产生跟人数等量的不重复时间点再随机与ID和人名组合
7:30-8:30相差60分钟,60*60-2=3598秒,假设有50人,则每间隔3598/50≈71秒打一次卡- @echo off&setlocal enabledelayedexpansion
- set t=07:30:00
- for /l %%i in (1 1 50) do (
- set r=71
- for /f "tokens=1-3 delims=:" %%a in ("!t!") do (
- set /a h=1%%a-100,m=1%%b-100,s=1%%c-100
- for %%d in (s m h) do (
- set /a "v=%%d,%%d=(%%d+r)%%60,r=(v+r)/60"
- )
- set /a h=100+h,m=100+m,s=100+s
- set t=!h:~-2!:!m:~-2!:!s:~-2!
- echo;!t!
- )
- )
- pause
复制代码
- @echo off
- rem win7及以上系统运行
- for /f "delims=" %%a in ('more +7 "%~f0"') do call set "list=%%list%%%%a;"
- set start=11:30
- set end=12:30
- powershell -c "$list=@{%list%};$len=$list.count;$array=Get-Random (1..$len) -count $len;$a=(New-TimeSpan %start% -end %end%).TotalSeconds;$t=(Get-Date %start%);$r=0;while($r -le ($len-1)){'time=\"{0}\" id=\"{1}\" name=\"{2}\"' -f $t.ToString('yyyy-MM-dd HH:mm:ss'),$array[$r],$list[$array[$r]];$r++;$t=(Get-Date $t).AddSeconds((Get-Random -min ([int](($a-2)/$len/2)) -max ([int](($a-2)/$len))))}"
- pause&exit
- 1='陈一'
- 2='黄二'
- 3='张三'
- 4='李四'
- 5='王五'
- 6='赵六'
- 7='钱七'
- 8='孙八'
- 9='杨九'
- 10='吴十'
复制代码
作者: tuquan 时间: 2016-12-2 07:46
感谢版主大人的回复,第一段代码 可以实现生成顺序的时间 但不是随机的
作者: pcl_test 时间: 2016-12-2 08:38
本帖最后由 pcl_test 于 2016-12-6 04:53 编辑
回复 4# tuquan - @echo off&setlocal enabledelayedexpansion
- set start=07:30:00
- set end=08:30:00
- for /f "delims=" %%a in ('wmic path win32_operatingsystem get LocalDateTime /value ^| findstr "="') do set %%a
- set /a "a=(1%start:~,2%-100)*3600+(1%start:~3,2%-100)*60, b=(1%end:~,2%-100)*3600+(1%end:~3,2%-100)*60"
- for /f "tokens=1,2 delims==" %%a in ('more +22 "%~f0"') do set _%%a=%%b&set "#!random!_%%a=%%a"
- for /f "tokens=2 delims==" %%a in ('set #') do set /a n+=1&set #!n!=%%a
- set /a c=(b-a-2)/n
- (for /l %%i in (1 1 %n%) do (
- set /a "r=!random!%%(c/2)+(c/2+1)"
- for /f "tokens=1-3 delims=:" %%a in ("!start!") do (
- set /a h=1%%a-100,m=1%%b-100,s=1%%c-100
- for %%d in (s m h) do (
- set /a "v=%%d,%%d=(%%d+r)%%60,r=(v+r)/60"
- )
- set /a h=100+h,m=100+m,s=100+s,i+=1
- set start=!h:~-2!:!m:~-2!:!s:~-2!
- set /p=time="%LocalDateTime:~0,4%-%LocalDateTime:~4,2%-%LocalDateTime:~6,2% !start!"
- for %%j in (#!i!) do for %%k in (!%%j!) do echo; id="%%k" name="!_%%k!"
- )
- ))<nul
- pause&exit
- 1=陈一
- 2=黄二
- 3=张三
- 4=李四
- 5=王五
- 6=赵六
- 7=钱七
- 8=孙八
- 9=杨九
- 10=吴十
复制代码
作者: flyinnet9 时间: 2016-12-2 09:43
excel 函数 ="7:30"+RAND()*("8:30"-"7:30"),然后将单元格属性改为时间
想要多少个生成多少个,填到你的表里就好了
作者: tuquan 时间: 2016-12-2 09:48
回复 6# flyinnet9
好像不可以的哦
这个生成的时间不是顺序递增的 倒是在区间内随机生成的
签到吗 肯定时间早的在前面
作者: CommandBatCmd 时间: 2016-12-2 10:00
回复 7# tuquan
把时间先排个序,再用就可以了,即随机又递增。
作者: tuquan 时间: 2016-12-2 10:00
回复 3# pcl_test
不好意思 我这现在没有WIN7及以上系统的电脑 第二段还没做测试
作者: flyinnet9 时间: 2016-12-2 10:05
回复 7# tuquan
排序不就好了,excel基本功能
作者: tuquan 时间: 2016-12-2 10:09
回复 10# flyinnet9
一排序时间又变了
作者: flyinnet9 时间: 2016-12-2 10:21
回复 11# tuquan
因为你排的是公式。。。。。
方法一:copy到一个文本文件,再copy回来
方法二:copy后,在excel中选择“选择性粘贴”-->"数值"
作者: tuquan 时间: 2016-12-2 18:14
回复 3# pcl_test
第二段做了测试 可以实现了
谢谢版主大人
就是随机出来的第一个时间必然start=时间,不过问题不大 改一下初始时间就好了
作者: tuquan 时间: 2016-12-2 18:38
回复 3# pcl_test
不好意思 我再多问一句 第二段代码可不可以在XP系统(安装程序或补丁)下运行
单位的电脑不让装WIN7及以上系统
作者: Nsqs 时间: 2016-12-6 04:41
直接简单做一个签到机不就行了,还这么麻烦
作者: GNU 时间: 2016-12-6 09:39
回复 14# tuquan
需要单独安装PowerShell才行
作者: codegay 时间: 2016-12-6 22:24
- #python生成随机时间段
- #2016年12月6日18:34:26 codegay
- #参考资料 http://www.runoob.com/python/python-date-time.html
- #Python 取一个时间段里面的时间 https://segmentfault.com/q/1010000006617581
-
- import time
- import random
- st = "2016-12-6 18:40:36"
- et = "2016-12-16 18:40:44"
- tf = "%Y-%m-%d %H:%M:%S"
-
- name = """11
- 22
- 33
- 44
- 狗三
- 猫4
- 猪八"""
- namelist = name.splitlines()
- count = len(namelist)
-
- print(namelist)
-
- def random_time(st,et,count=1):
- start = int(time.mktime(time.strptime(st,tf)))
- end = int(time.mktime(time.strptime(et,tf)))
- mktime = random.sample(range(start,end),count)
- strtime = [time.strftime(tf,time.localtime(r)) for r in sorted(mktime)]
- return strtime
-
- result = random_time(st,et,count)
-
- random.shuffle(namelist)#打乱名单的顺序
-
- for t in zip(result,namelist):
- print(*t)
-
-
- """
- 输出:
- ['11', '22', '33', '44', '狗三', '猫4', '猪八']
- 2016-12-08 04:00:26 33
- 2016-12-09 11:16:06 猪八
- 2016-12-12 08:13:51 狗三
- 2016-12-12 11:57:52 猫4
- 2016-12-12 12:56:37 11
- 2016-12-12 22:20:52 44
- 2016-12-16 02:47:04 22
- """
复制代码
作者: taofan712 时间: 2018-5-31 23:16
本帖最后由 taofan712 于 2018-5-31 23:18 编辑
- @echo off
- setlocal enabledelayedexpansion
- :LOOP
- set/a H=8+%random%%%2
- if %H% equ 8 (set/a M=30+%random%%%30) else (set/a M=%random%%%31)
- set/a S=%random%%%60,MS=%random%%%60
- CALL :help %H% %M% %S% %MS%
-
- set/a H=11+%random%%%2
- if %H% equ 11 (set/a M=30+%random%%%30) else (set/a M=%random%%%31)
- set/a S=%random%%%60,MS=%random%%%60
- CALL :help %H% %M% %S% %MS%
-
- set/a H=14
- set/a M=%random%%%30,S=%random%%%60,MS=%random%%%60
- CALL :help %H% %M% %S% %MS%
-
- set/a H=17+%random%%%2
- if %H% equ 17 (set/a M=30+%random%%%30) else (set/a M=%random%%%31)
- set/a S=%random%%%60,MS=%random%%%60
- CALL :help %H% %M% %S% %MS%
-
- PAUSE
- GOTO LOOP
-
- :help
- set/a n=0
- for %%a in (%1 %2 %3 %4) do (
- set var=00%%a:
- set/a n+=1
- if !n! equ 4 (set var=!var:~-3,-1!) else (set var=!var:~-3!)
- set/p tp=!var!<nul
- )
- echo;
- :eof
复制代码
啧啧啧,挺有意思的一个题目,我却没有巧妙思路,也是无趣。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |