【发布时间】:2014-04-29 11:28:46
【问题描述】:
我已优化代码以随机采样包含 -1、0 和 1 的数组,概率为 1/4、1/2、1/4。好像
#define n (12)
unsigned int x,y=34353,z=57768,w=1564; //PRNG seeds
/* xorshift PRNG
* Taken from https://en.wikipedia.org/wiki/Xorshift#Example_implementation
* Used under CC-By-SA */
u_int32_myRand() {
unsigned int t;
t = x ^ (x << 11);
x = y; y = z; z = w;
return w = w ^ (w >> 19) ^ t ^ (t >> 8);
}
x=(int)time(NULL); //seed PRNG
unsigned int k
int F[n];
for(k=0; k<n; k++) {
F[k]=(1-(myRand()&3))%2;
}
我怎样才能修改它,使它只返回恰好有 n/3 个零的数组并且仍然快速?
【问题讨论】:
-
你能解释一下当前的算法吗?
-
@Don'tYouWorryChild myRand() 只是生成一个随机数。 1-myRand()&3 给出 -1、0、1 或 2。因此 (1-(myRand()&3))%2 根据需要给出概率 1/2 的 0 和概率 1/4 的 -1 和 1。
-
所以对于您的答案,只需删除
%2并将其转换为unsigned,这将使操作&3返回0、1或2,因此0现在有1/3的概率。 -
@Don'tYouWorryChild 是的,但我需要将零的数量固定在 n/3。
-
@luk32 啊是的 {-2,-1,0,1,} 你是对的。当然 mod 2 你会得到相同的结果。我没有检查随机数生成器的质量。正如你所建议的,我认为我需要随机选择 n/3 个位置,在那里放置零,然后在其余位置放置随机选择的 -1 和 1。
标签: c performance algorithm math