这是我前一段时间接受采访的问题,我找不到答案.
给定一些样本S1,S2,... Sn和它们的概率分布(或权重,无论它叫什么)P1,P2,... Pn,设计算法随机选择样本考虑其概率.我带来的解决方案如下:
构建累积的权重数组Ci,例如
C0 = 0; Ci = C [i-1] + Pi.
同时计算T = P1 + P2 + ... Pn.这需要O(n)时间
现在的实际问题是:假设我想要改变其中一个初始权重Pj.如何在O(n)时间内做到这一点?其他数据结构是可以接受的,但随机抽样算法不应该比O(logN)差.
我有一个长度为100的向量t,并希望将其分为30和70值,但这些值应随机选择,无需替换.因此,30个值中没有一个被允许在70个值的子向量中,反之亦然.
我知道R函数sample可以用来随机选择带有和不带替换的向量的值.但是,即使我使用replace = FALSE,我必须sample使用30 运行该函数两次,并选择70个值运行一次.这意味着30个值中的一些可能在70个值中,反之亦然.
有任何想法吗?
我有两个列表x和y,长度为n,x i和y i形成一对.如何在保留配对信息的同时从这两个列表中随机抽取m个值(例如x [10]和y [10]将在结果样本中一起)
我最初的想法是这样的.
代码看起来像这样.
templist = list()
for tup in zip(x, y):
templist.append(tup)
random.shuffle(templist)
x_sub = [a for a, b in templist[0:m]]
y_sub = [b for a, b in templist[0:m]]
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很狡猾.有什么方法可以让我更清晰,更简洁,还是Pythonic?
我有random.sample函数的问题.这是代码:
import random
import numpy as np
simulateData = np.random.normal(30, 2, 10000)
meanValues = np.zeros(1000)
for i in range(1000):
dRange = range(0, len(simulateData))
randIndex = np.random.sample(dRange, 30)
randIndex.sort()
rand = [simulateData[j] for j in randIndex]
meanValues[i] = rand.mean()
Run Code Online (Sandbox Code Playgroud)
这是错误:
TypeError Traceback (most recent call last)
<ipython-input-368-92c8d9b7ecb0> in <module>()
20
21 dRange = range(0, len(simulateData))
---> 22 randIndex = np.random.sample(dRange, 30)
23 randIndex.sort()
24 rand = [simulateData[i] for i in randIndex]
mtrand.pyx in mtrand.RandomState.random_sample (numpy\random\mtrand\mtrand.c:10022)()
TypeError: random_sample() takes at most 1 …Run Code Online (Sandbox Code Playgroud) 准备一个新的心理物理实验,我有48次原始刺激显示4次(4个条件),导致192次试验.试图在实验过程中随机化演示的顺序,我需要最大化相同原始刺激的4显示之间的距离.
请考虑 :
Table[{j, i}, {j, Range[48]}, {i, Range[4]}]
Run Code Online (Sandbox Code Playgroud)
其中j是原始刺激数和我的条件
输出样本:
{{1, 1}, {1, 2}, {1, 3}, {1, 4},
{2, 1}, {2, 2}, {2, 3}, {2, 4},
...
{47, 1}, {47, 2}, {47, 3},{47, 4},
{48, 1}, {48, 2}, {48, 3}, {48, 4}}
Run Code Online (Sandbox Code Playgroud)
我怎样才能改变这192个项目的呈现顺序,最大化相同项目之间的距离j,原始刺激数量?
我写了以下功能
bool random_bool(double probability)
{
double p_scaled = probability * (RAND_MAX+1) - rand();
if ( p_scaled >= 1 ) return true;
if ( p_scaled <= 0 ) return false;
return random_bool( p_scaled );
}
Run Code Online (Sandbox Code Playgroud)
给定,rand()从均匀分布生成一个{0,1,...,RAND_MAX-1,RAND_MAX}数字,后续调用中的数字可以被视为独立于除加密之外的所有实际目的,这应该true以概率返回p:两个if语句true以略低于概率的方式返回p,并且false概率略高于1-p,而递归调用处理其他所有事情.
但是,以下测试失败:
long long N = 10000000000; //1e10
double p = 10000.0 / N;
int counter = 0;
for (long long i=0;i<N;i++) if (random_bool(p)) counter++;
assert(9672 < counter …Run Code Online (Sandbox Code Playgroud) 这个问题涉及System.Random当从连续种子生成连续的随机数时观察到的时间相关性的起源(其中每个种子丢弃相同数量的生成器).
在使用System.Random中的mkStdGen生成随机布尔值答案1并使用System.Random中的mkStdGen生成随机布尔值答案2建议(基于引用其中的reddit文章)应该丢弃前几个生成器以获取明智的结果.然而,我发现不管有多少发生器丢弃,当观察分布的时间方面时,如果用连续种子生成连续的随机数(一个丢弃每个种子的相同数量的生成器),则获得不希望的结果.
我的问题是,所采用的算法是什么 System.Random 导致了所述方式中不同种子之间的时间相关性?
如果我们生成无限序列的随机布尔值,则P(n)获得n具有相同值(例如[True,True,True]in [False,True,True,True,False])的连续布尔值的概率为(1/2)^n.作为快速检查,我们有标准化条件:
P(1)+P(2)+....P(infty) = (1/2) + (1/2)^2 + ... = 1
Run Code Online (Sandbox Code Playgroud)
以下代码:
module Main where
import Data.List
import System.Random
generateNthGenerator startGen 0 = startGen
generateNthGenerator startGen n = generateNthGenerator newGen (n-1)
where newGen = snd $ ((random startGen) :: (Bool,StdGen))
better_mkStdGen generation seed =
generateNthGenerator (mkStdGen seed) generation
randomNums generation =
map (fst . random . (better_mkStdGen generation)) [0 .. …Run Code Online (Sandbox Code Playgroud) 我想在很长一段时间内(例如,几个月或几年)运行Splunk查询,但我正在搜索足够的数据,我只能搜索数小时或数天的数据.
但是,对于我想在Splunk中回答的问题,我会对统一或统计上无偏见的数据样本感到满意.换句话说,我希望查询返回N个事件在过去一个月内展开,而不是任何N个连续事件.
我考虑的一种方法是仅搜索事件,date_minute=0以便快速过滤1/60事件,这有助于但不是非常灵活.
有没有更好的方法在Splunk中有效地采样事件?
在他们使用的概率分布方面?我知道runif给出了小数,而样本给出了整数,但我感兴趣的是样本是否也使用"均匀概率分布"?
如何n从无法放入内存的非常大的文件中获取随机行。
如果我可以在随机化之前或之后添加过滤器也很棒。
就我而言,规格是:
所以从文件中丢失几行不会是一个大问题,因为无论如何它们都有 1 万分之一的机会,但性能和资源消耗将是一个问题