我的作业涉及生成 0 和 2^30 之间的随机整数。现在,在过去我们了解到 rand() 只返回小于 RAND_MAX 的整数,这小于 UINT_MAX,并且我们可以使用位移来填充 UINT_MAX 容量。从我所做的一些阅读中(这里,关于 SO),我意识到如果这些数字的分布对我很重要,这可能不是一个好主意。话虽如此,我的教授已经指定了这种方法。
我的问题是,位移多少? RAND_MAX 和 UINT_MAX 之间的差异是否始终存在一个安全常数来进行位移?或者是否需要进行一些初始探测以确定要移位的数字?我是否应该保持位移一点点并检查 UINT_MAX?
我问的原因是,UINT_MAX 被定义为至少是某个数字 (65535),但在我的机器上 UINT_MAX更大(4294967295)。这让我担心我可能会在周末完成作业,到达学校后发现一切都不够顺利,无法提交。
谢谢!
引用资料:
我读过几个类似的问题,但无法从他们那里得到答案。
Is the value of RAND_MAX always (2^n)-1?
generating a random number within range 0 to n where n can be > RAND_MAX
实际上,上面的第二个问题让我怀疑这样做是否值得?
最佳答案
您的问题围绕着是否 RAND_MAX和 UINT_MAX他们之间有一点转变。这减少了是否 UINT_MAX 的问题和 RAND_MAX形式为 2^k - 1 . UINT_MAX几乎肯定会出现在任何基于二进制数系统的计算机上。如果sizeof(int)=32然后位 k=32 , 如果 sizeof(int)=64 bit然后 k=64等。现在我们可以考虑RAND_MAX .在大多数实现中,答案是 RAND_MAX几乎总是采用 2^k - 1 的形式.为什么?我们需要考虑 rand() 的大多数实现方式实际工作。
rand()通常使用线性同余生成器(参见 http://en.wikipedia.org/wiki/Linear_congruential_generator 或 Knuth“计算机程序员的艺术第 2 部分:半数值算法”)。基本上,随机数是一个带有 seed 的序列。
x(k+1) = ( a x(k) + c ) % m
(即 C 库存储最后一次迭代的 x(k) 并且当您调用 rand() 时它返回 x(k+1) )
要获得良好的质量,必须谨慎选择生成器的参数(a、c 和 m)。质量通常涉及序列重复自身之前的次数等。选择这些参数的一个紧张因素是使m成为可能。接近UINT_MAX尽可能避免浪费潜在的随机位。如果你研究发电机,通常正确的选择是 m略小于 UINT_MAX .您还需要制作 m一个素数。
通常您需要 rand()尽可能快,所以你希望这些操作便宜。最便宜mod计算是一种形式 foo % (2^k - 1)因为它可以实现为 foo & (1<<k-1) .专供选择k你会得到一个梅森素数。
例如,一个常见的选择是 k=31产生素数 2^31-1 = 2147483647 .这是 32 位整数的典型选择,其中 UINT_MAX=2^32-1 = 4294967295 .对于 64 位数字,一个有 UINT_MAX=2^64-1=18446744073709551615 RAND_MAX 的选择是 2^61-1 = 2305843009213693951 .
总而言之,回答你的问题:在大多数实现中,你可以假设有一个简单的位移位,但是,没有真正的保证。至少你应该在你的程序初始化时做一个运行时测试。如果您使用 C++,更好的做法是使用 static_assert在编译时检测您的假设是否正确,如果不正确则无法编译。 Boost 有这样一个静态断言,最近批准的标准 C++11 也是如此……即可以做到(尽管编写 is_power_of_two_minus_one 的静态版本可能需要一些工作):
unsigned int myrand()
{
static_assert(sizeof(int)==4,"sizeof(unsigned int) != 4");
static_assert(is_power_of_two_minus_one(RAND_MAX),"RAND_MAX not a power of two minus one");
static_assert(is_power_of_two_minus_one(UINT_MAX),"UINT_MAX not power of two minus one");
unsigned int raw_rand=rand();
// do your bit shift to adjust raw_rand
return raw_rand;
}
关于c++ - RAND_MAX 和 UINT_MAX 之间的差异会有所不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8283570/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)