Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据条件生成随机num_Python_Algorithm - Fatal编程技术网

Python 如何根据条件生成随机num

Python 如何根据条件生成随机num,python,algorithm,Python,Algorithm,我想生成[1,n]范围内的2n-1个随机整数,每个元素出现两次,随机值除外,它只出现一次。 例如: n = 3 seq = [1, 2, 3, 1, 3] 在本例中,2只出现一次 我的算法是使用字典,如下所示: ------------- | num |times| | 1 | 2 | | 2 | 1 | | 3 | 2 | 0 2 3 4 0 1 2 3 4 其中,关键点从1到n,该值表示关键点的出现次数。我用两个值填充字典,并将一个随机键的值减少到1 还有

我想生成[1,n]范围内的2n-1个随机整数,每个元素出现两次,随机值除外,它只出现一次。 例如:

n = 3  
seq = [1, 2, 3, 1, 3]  
在本例中,2只出现一次

我的算法是使用字典,如下所示:

------------- | num |times| | 1 | 2 | | 2 | 1 | | 3 | 2 |
0
2
3
4
0
1
2
3
4
其中,关键点从1到n,该值表示关键点的出现次数。我用两个值填充字典,并将一个随机键的值减少到1

还有其他算法吗? 如果n非常大导致无法存储在内存中,该怎么办?
我不确定我100%确定你想要什么,但这里有一个尝试:

import random as rn

x = range(3)*2 #generate a list where each number appears twice

rn.shuffle(x) #shuffle it
x.pop()       #remove one number
结果:

>>> x
[2, 0, 2, 1, 0] #the result is a list where every number appears twice, except for
                #one number which was removed at random, also the numbers are 
                #randomly arranged
编辑:

这里是一个尝试,为非常大的n这样做,一个列表的大小不能存储在您的ram。我看不出如何洗牌整数。但是,我可以随机删除一个。假设您想将列表写入txt文件

drop = rn.range(0,n) #choose a random integer to drop

with open('my_file.txt','w') as f:
    for ind,ele in enumerate(xrange(n)):  
        if ind == drop: #do not write the element to txt file
            pass
        else:
            f.write(str(ele) + '\n') #write every except for one element to txt file

with open('my_file.txt','a') as f:
    for ele in xrange(n):
        f.write(str(ele) + '\n') # write every element to txt file
最后,我们两次将n-1个元素写入txt文件,一次将1个元素写入txt文件,该元素是随机选择的

对于n=5,txt文件如下所示:

------------- | num |times| | 1 | 2 | | 2 | 1 | | 3 | 2 |
0
2
3
4
0
1
2
3
4

在上述情况下,1只显示一次,其他数字显示两次。

与@Akavall一样,不确定我是否理解正确。您希望生成1到n范围内的2n-1个数字,包括我假设的n个数字。这些数字不是真正随机的,只有一个出现过

import random

n=3

# Generate n numbers
numbers = [i for i in range(1,n+1)]
# Concatenate list to itself (now have 2n numbers)
numbers *= 2
# Remove a random element in the list (now have 2n-1 numbers)
numbers.pop( random.randint(0, len(numbers)-1) )

# Print results
from collections import Counter
print( Counter(numbers) )
输出

Counter({1: 2, 3: 2, 2: 1})
for number, frequency in generate_counts(10):
    print "%i: %i"%(number,frequency)

1: 2
2: 2
3: 2
4: 1
5: 2
6: 2
7: 2
8: 2
9: 2
10: 2
2․如果n非常大,导致无法存储在内存中,该怎么办

这取决于你想对这些数字做什么,以及顺序是否重要。从你呈现表格的方式来看,我想说你不关心顺序,所以即使是大n,编码整个表格所需的实际信息量也非常小:n本身和索引只有一个条目


如果您认为内存会成为一个问题,那么完全改变您的方法可能会更好,但如果没有更多信息,则很难说。

1我建议使用随机数生成器来选择您的单个数字,然后我将使用生成所有数字的集合,然后使用内置的随机数方法。我建议使用内置的shuffle方法,因为内置的方法往往是高度优化的

Java集合参考: Java shuffle参考:
2若n非常大,那个么您可能希望将数字块写入文件,并在任何给定时间仅对部分进行洗牌。一个类似的例子是试图同时洗牌5副牌。这充其量是非常困难的,但是您可以将大集合中的一部分混合在一起,将这些部分返回到大集合,然后再选择两个部分进行混合,重复操作,直到满足所需的混合要求。

生成频率表的生成器,这将有助于解决内存问题

from random import randint

def generate_counts(n):
    remove_index = randint(1,n+1)
    return ((i+1,2-(remove_index==i)) for i in range(n))
输出

Counter({1: 2, 3: 2, 2: 1})
for number, frequency in generate_counts(10):
    print "%i: %i"%(number,frequency)

1: 2
2: 2
3: 2
4: 1
5: 2
6: 2
7: 2
8: 2
9: 2
10: 2

这将有一个不受欢迎的特性,即只弹出最右边的项,这是相当非随机的。del x[random.range0,lenx-1]会比pop好。@msw最右边的项目是完全随机的,因为pop发生在洗牌之后。这确实是可行的。我想知道如果n很大我怎么做?@KarlKnechtel:同意,这个问题有多种解释。这对我很有帮助。如果我正确编辑了你的意图,您的方法会生成创建序列所需的计数,但不会像示例中所示生成序列。这到底是为了什么?这是一个Python问题,而不是Java问题。