python随机生成20个0~100范围的数字_如何在Python中随机生成递减数字?

8 个答案:

答案 0 :(得分:14)

我会生成一个n个随机数的列表,然后将它们从最高到最低排序。

答案 1 :(得分:3)

很少有事情需要注意。从X > 0开始并在每个步骤中开始的算法从(0,X)获取一个随机数,并用它替换X是不行的。为什么?因为(假设random表现正常)每个步骤中的预期值位于区间(0,X)的中间。这意味着这些数字的序列预计会以0的速度收敛到(1/2)^N。事实上,很容易看出大多数数字接近0,即使是巨大的初始价值。这意味着这些数字的分布并不均匀,这在大多数情况下都是理想的属性。

这是一个主要缺点,即使生成N数字的复杂性为O(N)且(更重要的)内存使用量为O(1)。

另一个解决方案是只取N个随机数并对它们进行排序。虽然这个算法的复杂性是O(N log(N))(或者与底层排序算法的复杂性相同),但是如果我们按顺序放置元素而不是排序,可以将其简化为O(N),这也不错。但内存使用量为O(N) - 我们必须记住所有元素。然而,这些数字将是均匀分布的,这是一个很大的优势!

根据Jon Louis Bentley撰写的论文“Generating sorted lists of random numbers”中的想法,这里的算法可能是最优的算法(至少我知道)并且产生均匀分布的数字:

import math

import random

def generate( min = 0, max = 10, number = 100 ):

start = 0

for i in xrange( number, 0, -1 ):

start = start + math.log( random.random( ) ) / i

next = math.exp( start ) * ( max - min ) + min

yield next

for number in generate( ):

print number

请注意,此算法的复杂性仍为O(N)(我怀疑可以降低),但内存使用率为O(1),这些数字均匀分布在区间(min,max)中,而不是这显而易见,但却是事实。唯一的缺点是我们必须知道在开始之前我们想要生成多少个数字。

还看一下这个帖子:

可能有用。

答案 2 :(得分:2)

像:

from random import random

min=0

max=10

oldval=1.

while True:

oldval=oldval*random()

randval=min+(max-min)*oldval

答案 3 :(得分:1)

以下是一些替代方案。这应该产生接近卡方分布的值,后面的值从比以前的值更小的范围中选择:

import random

random_range = range(10)

numbers = [random.choice(random_range[:i]) for i in range(10, 0, -1)]

这也可以使用浮点数来完成:

import random

max = 10.0

min = 0.0

desired = 100

step = (max - min) / desired

numbers = [random.random() * (max - (i * step)) for i in range(desired)]

或者,从递减的滑动窗口中选择随机值可以提供均匀分布。

import random, numpy

max = 10.0

min = 0.0

desired = 100

step = float(min - max) / desired

window = 1.0

numbers = [x + (random.random() * window) - (window / 2.0) for x in numpy.arange(max, min, step)]

如果需要单调递减的数字列表,则设置window <= step将提供一个。祝你好运!

答案 4 :(得分:1)

谢谢大家的回答。但是我找到了解决我自己问题的方法,我觉得这很简单,我想与大家分享一下。

import random

i = 1000000

while i > 0:

i = random.randint(0, i)

print i

答案 5 :(得分:1)

基于@ brentlance的想法,这适用于任何整数范围,正面,负面或两者:

import random

random_decreasing_integers_from_range = (i for i in xrange(max, min - 1, -1) if random.random() > .5)

如果您希望能够指定输出的数量,这里尝试至少尝试使整个范围内的分布保持一致:

import random

def random_decreasing_integers_from_range(min, max, num_outputs):

range_size = abs(max - min)

if range_size < num_outputs:

raise ValueError('Distance from min to max must be equal to or greater than num_outputs.')

output_count = 0

for iteration, value in enumerate(xrange(max, min - 1, -1)):

# if we only have enough values left to satisfy the number requested,

# yield value

if num_outputs - output_count == range_size - iteration + 1:

output_count += 1

yield value

# else yield value randomly, weighted by how far in to the range we are

# and how many values we have left to yield of the total requested

else:

ratio_consumed = float(iteration + 1) / range_size

ratio_yielded = float(output_count) / num_outputs

if random.random() < (1 - ratio_yielded) * ratio_consumed:

output_count += 1

yield value

# if we've yielded the requested number of values, stop

if output_count == num_outputs:

break

这种方法运行得相当不错,但是当num_outputs不在range_size的大约10%到25%之间时,它似乎会崩溃。在下限,有利于范围的中间真正显示,而在上限,短路条件开始导致结果真正有利于范围的下端。

答案 6 :(得分:0)

不是python的专家......但这是我的基本想法:

a=10000

for i in range(1,50):

b=random.randint(1,a)

print(b)

a=b

答案 7 :(得分:0)

这将使您减少0..1范围内的随机数。

import random

def generate():

n = 1.0

while n:

n = random.random() * n

yield n

iterator = generate()

iterator.next()

请注意,由于浮点数的精度有限,函数会在一段时间后停止产生数字,因为数字不可避免地达到0。

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_39980575

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值