作为蒙特卡罗模拟的一部分,我必须掷一组骰子,直到某些值出现一定次数。我执行此操作的代码调用了一个骰子类,该类生成1到6之间的随机数,并返回它。最初代码看起来像publicvoidroll(){value=(int)(Math.random()*6)+1;}而且速度不是很快。通过交换Math.random()为ThreadLocalRandom.current().nextInt(1,7);它用原来大约60%的时间运行了一个部分,调用了大约2.5亿次。作为完整模拟的一部分,它至少会调用此方法数十亿次,那么有没有更快的方法来做到这一点? 最佳答案
我需要在最大值范围内生成随机整数。由于性能至关重要,我决定使用XORShift生成器而不是Java的Random类。longseed=System.nanoTime();seed^=(seed>>35);seed^=(seed此实现(source)给了我一个长整数,但我真正想要的是一个介于0和最大值之间的整数。publicintrandom(intmax){/*...*/}实现此方法最有效的方法是什么? 最佳答案 我从你的代码中得到了一些乐趣并想出了这个:publicclassXORShiftRandom{privatelongla
我一直在研究Xorshift*随机数生成器,我遇到了this探索它们的属性。从该站点引用(强调我的):Howcanaxorshift64*generatorbeslowerthanaxorshift1024*generator?Dependencies.Thethreexor/shiftsofaxorshift64*generatormustbeexecutedsequentially,aseachoneisdependentontheresultofthepreviousone.Inaxorshift1024*generatortwoofthexor/shiftsarecomplet
我需要一个好的伪随机数生成器(PRNG),目前最先进的似乎是xorshift128+算法。不幸的是,我发现了2个不同的版本。维基百科上的那个:Xorshift显示为:uint64_ts[2];uint64_txorshift128plus(void){uint64_tx=s[0];uint64_tconsty=s[1];s[0]=y;x^=x>17)^(y>>26);//b,creturns[1]+y;}这看起来很简单。更重要的是,编辑日志似乎显示该代码片段是由名为“Vigna”的用户添加的,该用户可能是“SebastianoVigna”,他是关于xorshift128+的论文的作者:
我有以下代码(这xorshift128+Wikipedia的代码修改以使用向量类型):#include#include__v8sirand_si(){staticautos0=__v4du{4,8,15,16},s1=__v4du{23,34,42,69};autox=s0,y=s1;s0=y;x^=x>17)^(y>>26);return(__v8si)(s1+y);}#include#includevoidfoo(){//Shuffleabit.Theresultismuchworsewithoutthis.rand_si();rand_si();rand_si();rand_si();a
我想用Java、Python和JavaScript实现XorShiftPRNG。给定相同的种子,不同的实现必须生成完全相同的序列。到目前为止,我还无法做到这一点。我在Java中的实现在Java中具有以下XorShiftPRNG实现(其中x是一个long字段):publiclongrandomLong(){x^=(x>>35);x^=(x如果我将x设为1,对randomLong()的前四次调用将生成:356516011130297953386881-9204155794254196429144132848981442561我在Python中的实现我已经尝试过使用和不使用numpy。下面是