Board logo

标题: [数值计算] [已解决]批处理如何生成1到99999之间的数字? [打印本页]

作者: kkfgef    时间: 2016-2-18 14:57     标题: [已解决]批处理如何生成1到99999之间的数字?

请教如何随机生成1到999999999之间的数字
例如要随机应变生成1至999999999之间的一千万行数字,每一百万枚一个文本
其中每行文本的位都为最大的九位
不足的前面加0:
  1. 123456789
  2. 987654321
  3. 000000001
  4. 000010001
  5. 098765432
  6. 100000001
  7. ………………
复制代码

作者: ivor    时间: 2016-2-18 15:12

本帖最后由 ivor 于 2016-2-18 18:03 编辑

回复 1# kkfgef
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,10) do (
  3. for /l %%b in (1,1,1000000) do (
  4. set ran=!random!!random!!random!!random!
  5. echo !ran:~-9!
  6. )
  7. )>%%a.txt
  8. pause
复制代码
  1. # python 3.5.1
  2. # coding:utf-8
  3. # 功能:随机9位数字前面补0,无重复
  4. import random, os, time,traceback
  5. start_time = time.time()
  6. num = list(range(10000000))
  7. random.shuffle(num)
  8. a = 1
  9. wFile = open("%s/%d.txt" % (os.path.split(__file__)[0],a ), 'w')
  10. print("正在写入第%d个文件" % a)
  11. try:
  12.     for i in range(len(num)):
  13.         num[i] = "%09d" % num[i]
  14.         if  i / 1000000 >= a:
  15.             a += 1
  16.             wFile.close()
  17.             wFile = open("%s/%d.txt" % (os.path.split(__file__)[0], a), 'w')
  18.             print("正在写入第%d个文件" % a)
  19.         wFile.write(num[i] + "\n")
  20. except:
  21.     traceback.print_exc()
  22. finally:
  23.     wFile.close()
  24.     print("耗时:%d秒" % (time.time() - start_time))
  25.     input("按回车退出")
复制代码
python 10个文本全部写入耗时39s。

CMD 结果就不发了,需要几分钟
作者: kkfgef    时间: 2016-2-18 16:05

回复  kkfgef python 10个文本全部写入耗时36s。

CMD 结果就不发了,需要几分钟
ivor 发表于 2016-2-18 15:12



    python没安装没试过,第一个脚本生成了一万行,有351行重复……
作者: wskwfkbdn    时间: 2016-2-18 16:51

回复 1# kkfgef


    目的??意义??
作者: ivor    时间: 2016-2-18 17:22

本帖最后由 ivor 于 2016-2-18 17:25 编辑

回复 3# kkfgef


    2楼  python 代码已更新,去除重复结果
作者: bailong360    时间: 2016-2-18 23:03

本帖最后由 bailong360 于 2016-2-19 18:52 编辑
  1. @shuf -n 10000000 -i 1000000000-2000000000|split -l 1000000
  2. @sed -i "s/^.//g" x*
复制代码
来个第三方的特技,话说管道传递这么大的数据会不会有点悬...
作者: codegay    时间: 2016-2-18 23:39

回复 6# bailong360


    c:\>@shuf -n 10000000 -i 1000000000-2000000000|split -l 1000000 SHUF.txt
shuf: Cannot allocate memory.
split: SHUF.txt: No such file or directory
作者: ivor    时间: 2016-2-19 00:04

本帖最后由 ivor 于 2016-2-19 00:50 编辑

用啥语言,一次性生成10亿个数字都得歇菜,除非分批来解决

考虑用两个数组表示,只是效率不高,但是你想要多大的随机数内存都不是问题
作者: bailong360    时间: 2016-2-19 10:45

本帖最后由 bailong360 于 2016-2-19 10:47 编辑

回复 7# codegay of
嗯...大概需要申请3814M内存
@kkfgef  你家电脑内存多少?
作者: kkfgef    时间: 2016-2-19 11:10

回复  codegay of
嗯...大概需要申请3814M内存
@kkfgef  你家电脑内存多少?
bailong360 发表于 2016-2-19 10:45



    4G内存哟
作者: codegay    时间: 2016-2-19 13:19

回复 9# bailong360


    一千万行九位数据,TXT大约100M,python一次生成这么多随机数时,进程占用内存是220M-450M左右。使用集合去重处理,内存占用增加到550M,发现每一千万随机数,大约只有五万个是重复的。

另外我电脑可用内存在6-8G时运行你的批处理也是报和上面一样的错误。
  1. """
  2. 如何随机生成1到999999999之间的数字.py
  3. http://bbs.bathome.net/thread-39410-1-1.html
  4. 2016年2月19日 01:56:51 codegay
  5. """
  6. import time
  7. import random
  8. start=time.time()
  9. print("运行中..."*3)
  10. txt={str(random.randint(1000000001,2000000000))[1:]+"\n" for r in range(10000000)}#集合解析生成一千万随机数并去重。会导致比列表解析慢上7秒左右。运行耗时: 44
  11. print(len(txt))
  12. with open("sj.txt","a+") as f:
  13.     f.writelines(txt)
  14. end=time.time()
  15. pt=end-start
  16. print("运行耗时:",pt)
  17. try:
  18.     input("按回车退出")
  19. except SyntaxError:
  20.     pass
复制代码

作者: bailong360    时间: 2016-2-19 19:26

回复 11# codegay
python果然强悍
  1. #lang racket
  2. (require 2htdp/batch-io)
  3. (letrec ([main (lambda (l t)
  4.                  (when (<= 10 t)
  5.                    (printf "writing file ~v.txt~n" t)
  6.                    (call-with-output-file (string-append (number->string t) ".txt")
  7.                      (lambda (output-port)
  8.                        (for-each (lambda (x)
  9.                                    (fprintf output-port "~a~n" (substring (number->string x) 1)))
  10.                                  (take l 1000000))))
  11.                    (main (drop l 1000000) (+ t 1))))])
  12.   (main (shuffle (range 1000000000 2000000000)) 1))
复制代码
哎,来个racket的练练手算了,速度有够慢... 这语言果然不适合干这些事儿....得找门简单实用的语言学一学了
作者: codegay    时间: 2016-2-19 19:41

回复 12# bailong360


    感觉是你写错了啊。range那不是要生成十亿个数字再shufle乱序?这样估计是会很慢。
作者: codegay    时间: 2016-2-19 19:44

回复 12# bailong360


    虽然我也没有写什么正式的作品,但是一想到python打包成EXE,要有好几M大。也是感觉到蛋疼。
作者: bailong360    时间: 2016-2-19 20:23

回复 13# codegay
嗯..我就是这么干的...
感觉想不到什么好方法
作者: codegay    时间: 2016-2-19 20:43

回复 15# bailong360


    明明可以random的.
作者: codegay    时间: 2016-2-19 20:48

怪不得需要4G左右的内存。




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