我有一组字符串,每个字符串都有数百万个字符。我想把它们分成随机长度的子串,这个我可以做没有特别的问题。
但是,我的问题是:如何在子串长度选择中应用某种权重?我的代码在python3
中运行,所以我想找到一个pythonic解决方案。详细地说,我的目标是:
谢谢您的帮助!
可能有很多方法可以做到这一点。我会这样做:
rand
区间取一个随机数[0,1]
:
import random
rand = random.random()
[0,1]
的范围内。您使用什么操作取决于您希望可能性分布的样子。一个简单的选择就是广场。
rand = rand**2
[0,1]
缩放到[1e04, 8e06]
并舍入到下一个整数:
subStringLen = round(rand*(8e06-1e04)+1e04)
subStringLen
的子字符串,并检查剩余的字符数。
如果剩下的是8e06
以上的字符,请转到第1步。
如果1e04
和8e06
之间存在,请将它们用作最后一个子串。
如果小于1e04
,你需要决定是否要抛弃其余部分,或者在这个speciel案例中允许小于1e04
的子串。我确信在效率方面有很多改进,这只是为了让你了解我的方法。
NumPy
提供许多random采样功能。看看各种distributions可用。
如果你正在寻找一些重量较低的东西,那么exponential distribution可能会起作用吗?
使用matplotlib
,您可以绘制值的直方图,这样您就可以更好地了解分布是否符合您的要求。
所以像这样:
import numpy as np
import matplotlib.pyplot as plt
# desired range of values
mn = 1e04
mx = 8e06
# random values following exp distribution
values = np.random.exponential(scale=1, size=2000)
# scale the values to the desired range
values = ((mx-mn)*values/np.max(values)) + mn
# plot the distribution of values
plt.hist(values)
plt.grid()
plt.show()
plt.close()