Python中如何实现一个算法

需求: 在 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))


Python中如何实现一个算法

18 回复

突然想起来 字典的无序 好像不符合 随机数这个点… 这个算法是错的= =!!!求大佬


要回答这个问题,得先知道你具体想实现什么算法。Python实现算法通常就是写函数或类。我举个最常见的例子,比如实现一个快速排序算法,可以直接用几行代码搞定。

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

# 示例
my_list = [3, 6, 8, 10, 1, 2, 1]
sorted_list = quick_sort(my_list)
print(sorted_list)  # 输出: [1, 1, 2, 3, 6, 8, 10]

核心就是理解算法逻辑,然后用Python的数据结构和控制流把它表达出来。如果是更复杂的算法,可能还需要用到递归、动态规划这些概念。总之,先理清思路再动手写就对了。

总结:先明确算法步骤,再转化为Python代码。

i for i in range(1,10000001) 是遍历,不是随机给, 你是不是想 random.randint

Generator

看不懂,你这 for i in dic.values() , i 又没有使用,什么逻辑?

接上面,你这数组不会炸吗?

https://www.cnblogs.com/forget406/p/5294143.html

好像这个是伪随机数产生的算法,和你这个有点不一样

Python36 以上的 dict 已经有了,这样行不通吧

dic=[i for i in range(1,10000001)]
random.shuffle(dic)
ls=dic[:500000]

import random
arr = set()
while len(arr) < 500000:
arr.add(random.randint(1, 10000001))

随机不是那么容易实现的,字典也只是看似无序

这代码好像 append 也不对吧,应该是 append(i) 吧,而不是 append(dic.values())

是不可使用 random.sample 还是不可使用 random,如果是前者的话研究研究 random 别的方法,后者的话……自己写个伪随机?

楼主的基础知识也太差了些。字典的无序不是随机,那个键值做 hash 运算后是固定规律可寻的。
不知道楼主的随机数用途是什么,如果只是玩玩那么用 C 的 random 函数( python 的随机函数本质上是和 C 一样的)产生的伪随机数凑合用是可以的。但是大样本下这是不能做正式生产用途的,是可以找到规律的。

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

Mersenne Twister, the mostly widly used pseudo-random-number-generator

随机算法,你先看看这个基础的 wiki,你再想想你这个想法的实际场景,以及新的算法。反正研究是这么来的。

那个啥, 我想说, 什么叫随机数, 计算机里没有真正的随机数, 都是伪随机数, 那么好了:

<br>for i in range(500000): yield hash(i * 0.1) % 10000000<br>

随机数算法嘛, 还是用梅森旋转算法的好. 但是代价不低.

Python 3.6 的时候, cpython 的 dict 效仿了 pypy 的实现方案, 他会跟踪你 dict 添加元素的顺序.

回到顶部