如何用条件生成随机数

rem*_*emy 2 python algorithm

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

n = 3  
seq = [1, 2, 3, 1, 3]  
Run Code Online (Sandbox Code Playgroud)

在这个例子中,2只出现一次.

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

-------------
| num |times|
|  1  |  2  |
|  2  |  1  |
|  3  |  2  |

其中键从1到n,值表示键的出现次数.我用两个值填充字典,并将一个随机密钥的值减小为1.

  1. 还有其他算法吗?
  2. 如果n非常大导致无法存储在内存中怎么办?

Aka*_*all 9

我不确定我是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
Run Code Online (Sandbox Code Playgroud)

结果:

>>> 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
Run Code Online (Sandbox Code Playgroud)

编辑:

这是尝试为非常大的n(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
Run Code Online (Sandbox Code Playgroud)

最后我们写了n-1个元素到txt文件两次,1个元素一次,该元素是随机选择的.

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

0
2
3
4
0
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

在上面的情况中,1只出现一次,每隔一个数字出现两次.

  • @msw最右边的项目完全是随机的,因为pop在shuffle之后发生. (3认同)