需求: 在 1~10000000 范围内, 取 500000 个随机数,保证不重复, 每次取出数据缩小范围优化速度(不可使用 random.sample )
有没有比我写的还简单的....
def demo():
dic = {i:i for i in range(1,10000001)}
ls = []
for i in dic.values():
ls.append(dic.values())
if len(ls) == 500000:
break
print(len(ls))
import timeit
t = timeit.Timer('demo()', 'from __main__ import demo')
print(t.timeit(1))
1
LHZo OP 突然想起来 字典的无序 好像不符合 随机数这个点.......... 这个算法是错的= =!!!!求大佬
|
2
zhaoxiaowen123 2018-10-20 21:16:11 +08:00
i for i in range(1,10000001) 是遍历,不是随机给, 你是不是想 random.randint
|
3
ericls 2018-10-20 21:17:29 +08:00 via iPhone
Generator
|
4
renyijiu 2018-10-20 21:20:30 +08:00
看不懂,你这 for i in dic.values() , i 又没有使用,什么逻辑?
|
5
renyijiu 2018-10-20 21:22:04 +08:00
接上面,你这数组不会炸吗?
|
6
alixali 2018-10-20 21:49:09 +08:00
|
7
Trim21 2018-10-20 21:51:40 +08:00 via Android
Python36 以上的 dict 已经有了,这样行不通吧
|
9
FanWall 2018-10-20 21:52:17 +08:00 1
dic=[i for i in range(1,10000001)]
random.shuffle(dic) ls=dic[:500000] |
10
rabbbit 2018-10-20 21:53:25 +08:00
import random
arr = set() while len(arr) < 500000: arr.add(random.randint(1, 10000001)) |
11
lasuar 2018-10-20 21:54:30 +08:00
随机不是那么容易实现的,字典也只是看似无序
|
12
punderson 2018-10-20 22:04:26 +08:00
这代码好像 append 也不对吧,应该是 append(i) 吧,而不是 append(dic.values())
|
13
ys759206502 2018-10-20 22:21:49 +08:00
是不可使用 random.sample 还是不可使用 random,如果是前者的话研究研究 random 别的方法,后者的话……自己写个伪随机?
|
14
xpresslink 2018-10-20 23:05:11 +08:00
楼主的基础知识也太差了些。字典的无序不是随机,那个键值做 hash 运算后是固定规律可寻的。
不知道楼主的随机数用途是什么,如果只是玩玩那么用 C 的 random 函数( python 的随机函数本质上是和 C 一样的)产生的伪随机数凑合用是可以的。但是大样本下这是不能做正式生产用途的,是可以找到规律的。 真随机数靠程序是永远无法实现的,真正的业务系统都是用有认证的硬件随机数发生器的,那是用电路热噪声,布朗运动,量子效应,放射性衰变等做随机种子。 如果不想投资硬件,只能是找一台磁盘比较忙的 LINUX 服务器,从 /dev/random 读字节流,这个是真随机数,只是性能不高。 |
15
shm7 2018-10-20 23:55:00 +08:00
Mersenne Twister, the mostly widly used pseudo-random-number-generator
随机算法,你先看看这个基础的 wiki,你再想想你这个想法的实际场景,以及新的算法。反正研究是这么来的。 |
16
ltoddy 2018-10-21 10:25:33 +08:00
那个啥, 我想说, 什么叫随机数, 计算机里没有真正的随机数, 都是伪随机数, 那么好了:
``` for i in range(500000): yield hash(i * 0.1) % 10000000 ``` 随机数算法嘛, 还是用梅森旋转算法的好. 但是代价不低. |