Python 写一个算法

2018-10-20 20:39:28 +08:00
 LHZo

需求: 在 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))
3113 次点击
所在节点    Python
17 条回复
LHZo
2018-10-20 20:53:45 +08:00
突然想起来 字典的无序 好像不符合 随机数这个点.......... 这个算法是错的= =!!!!求大佬
zhaoxiaowen123
2018-10-20 21:16:11 +08:00
i for i in range(1,10000001) 是遍历,不是随机给, 你是不是想 random.randint
ericls
2018-10-20 21:17:29 +08:00
Generator
renyijiu
2018-10-20 21:20:30 +08:00
看不懂,你这 for i in dic.values() , i 又没有使用,什么逻辑?
renyijiu
2018-10-20 21:22:04 +08:00
接上面,你这数组不会炸吗?
alixali
2018-10-20 21:49:09 +08:00
https://www.cnblogs.com/forget406/p/5294143.html

好像这个是伪随机数产生的算法,和你这个有点不一样
Trim21
2018-10-20 21:51:40 +08:00
Python36 以上的 dict 已经有了,这样行不通吧
Trim21
2018-10-20 21:51:46 +08:00
@Trim21 有序*
FanWall
2018-10-20 21:52:17 +08:00
dic=[i for i in range(1,10000001)]
random.shuffle(dic)
ls=dic[:500000]
rabbbit
2018-10-20 21:53:25 +08:00
import random
arr = set()
while len(arr) < 500000:
arr.add(random.randint(1, 10000001))
lasuar
2018-10-20 21:54:30 +08:00
随机不是那么容易实现的,字典也只是看似无序
punderson
2018-10-20 22:04:26 +08:00
这代码好像 append 也不对吧,应该是 append(i) 吧,而不是 append(dic.values())
ys759206502
2018-10-20 22:21:49 +08:00
是不可使用 random.sample 还是不可使用 random,如果是前者的话研究研究 random 别的方法,后者的话……自己写个伪随机?
xpresslink
2018-10-20 23:05:11 +08:00
楼主的基础知识也太差了些。字典的无序不是随机,那个键值做 hash 运算后是固定规律可寻的。
不知道楼主的随机数用途是什么,如果只是玩玩那么用 C 的 random 函数( python 的随机函数本质上是和 C 一样的)产生的伪随机数凑合用是可以的。但是大样本下这是不能做正式生产用途的,是可以找到规律的。

真随机数靠程序是永远无法实现的,真正的业务系统都是用有认证的硬件随机数发生器的,那是用电路热噪声,布朗运动,量子效应,放射性衰变等做随机种子。
如果不想投资硬件,只能是找一台磁盘比较忙的 LINUX 服务器,从 /dev/random 读字节流,这个是真随机数,只是性能不高。
shm7
2018-10-20 23:55:00 +08:00
Mersenne Twister, the mostly widly used pseudo-random-number-generator

随机算法,你先看看这个基础的 wiki,你再想想你这个想法的实际场景,以及新的算法。反正研究是这么来的。
ltoddy
2018-10-21 10:25:33 +08:00
那个啥, 我想说, 什么叫随机数, 计算机里没有真正的随机数, 都是伪随机数, 那么好了:

```
for i in range(500000): yield hash(i * 0.1) % 10000000
```

随机数算法嘛, 还是用梅森旋转算法的好. 但是代价不低.
ltoddy
2018-10-21 10:26:32 +08:00
@LHZo Python 3.6 的时候, cpython 的 dict 效仿了 pypy 的实现方案, 他会跟踪你 dict 添加元素的顺序.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/499484

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX