【问题标题】:how to get the next random element knowing the previous one如何在知道前一个随机元素的情况下获得下一个随机元素
【发布时间】:2017-01-01 14:32:57
【问题描述】:

我有一个固定的对象列表(几乎它实际上来自数据库),我希望能够一次选择一个元素,并且在执行所有元素集之前永远不要选择之前看到的一个元素 知道该怎么做吗?

它与获得 randint(0, N) 但知道最后选择有关。我可以强制种子吗?


编辑

我应该更明确一点。对此感到抱歉。 当我向我的视图/函数发出请求时,我每次只得到一个元素。

在下一个请求中,我只想传递我得到的最后一个作为参数,并从同一个列表中随机获取另一个。但是由于 python 使用某种线性同余生成器 (u_1 = f(u_0) ) ,我希望能够用我的旧值播种它以获得下一个值。它不需要在统计上是完美的,而是大致随机的

def f(old = None):
  l = range(100)
  some_number = ??(l, old)
  return some_number

【问题讨论】:

  • 如果您想要选择而不替换,请从集合中删除任何已选择的元素。
  • 您的编辑毫无意义。所以基本上它可以选择 1 然后 2,然后 1,然后 2 ......只有 1 深度记忆不选择。
  • 我已尝试在编辑中考虑新请求,但我不确定您现在究竟想要什么。
  • @Jean-FrançoisFabre:如果你有一个线性随机生成器,它确实有意义。获得下一个随机数只需要前一个。这是我想使用但我不知道它是否暴露的特定属性

标签: python django django-models


【解决方案1】:

最简单的方法是在对象列表中使用random.shuffle(),然后遍历该列表。

import random

lst = [1, 2, 3, 4]

random.shuffle(lst)
print lst

如果您不想修改列表本身,请创建索引列表。

import random

indices = range(len(lst))

lst = [1, 2, 3, 4]

random.shuffle(indices)

for index in indices:
    print lst[index]

编辑

现在问题已经改变了,我认为您可以为此目的将这一原则更进一步。只需重建可用索引列表。

def return_random(indices, last_chosen):
    remaining_indices = [index for index in indices if index != last_chosen]
    return random.choice(remaining_indices)

【讨论】:

    【解决方案2】:

    这似乎有效

        import random
        def f(n):
            random.seed(n)
            return random.randint(0, 100)
    

    可能不适合建模或统计分析 - 但它是随机的,并且基于以前的数字。

    【讨论】:

    • 谢谢亚历克斯,简单,我需要什么。我不需要任何统计属性,而是一个纯函数
    • 是的,它似乎不适用于小种子数。基于 random.shuffle 的东西应该会更好。
    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多