Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在内部使用双倍来生成随机整数

在内部使用双倍来生成随机整数
EN

Stack Overflow用户
提问于 2012-03-24 09:22:55
回答 3查看 296关注 0票数 4

我发布了一堆开源的随机数生成器在我的网站上,包括一个正态分布的随机数生成器.为了在10-20范围内生成一个随机整数,我会编写类似于new NormalRandomGenerator(10, 20).Next()的东西。

有人发表了这样的评论:

只是想知道是否有必要用“double NextDouble()”来实现“int ()”,因为int到双重转换(以及visa-相反)在一些硬件上可能会非常慢,包括最近的PC硬件,尽管我目前还没有特别了解最新的CPU。

我相信这个评论指的是这样一个事实:当有人在我的一个类上调用Next(20)时,在内部,这个调用转化为类似于(int)someMersenneTwister.NextDouble() * 20的东西(我不记得我是否使用了舍入)。

我是这样实现的,因为MT既快速又高效(尽管它有一个巨大的随机周期)。据我所知,这是生成随机数的标准方法--调用Next(),它返回范围[0 .1)然后乘以并键入整数。

我的设计有什么问题吗?有没有更好的方法(更好的性能,更快)来生成一个不使用双数的整数随机数?

抱歉,如果这听起来很含糊。我不确定这里是否有问题。

EN

回答 3

Stack Overflow用户

发布于 2012-03-24 10:00:38

对你的问题没有一个答案(因为它在目前的形式上是没有意义的,海事组织)。但是,看看您的代码,我发现了一些bug和其他问题:

  1. 播种。随着时间的增长,这会导致在几毫秒内创建多个UniformRandomGenerator时的种子冲突。您从System.Random继承了这个问题。
  2. MersenneTwister.NextDouble质量低。double大约有53位数,只有32位。几乎和System.Random一样糟糕,它填满了31。
  3. MersenneTwister.Next(int maxValue)现在将坏的双倍扩展到所需的间隔上。如果间隔在长,这会导致强烈的偏见。System.Random有一个非常类似的问题。
  4. Next(int minValue, int maxValue)在计算maxValue-minValue时包含int溢出。
  5. NormalRandomGenerator的构造函数将平均值计算为this.Mean = ((max - min) / 2) + min;。这是一个整数除法,因此如果max-min是奇数,就会导致偏差。奇怪的选择,因为this.Mean是双倍的。
  6. 计算正态分布数字的代码看起来也很奇怪,但是我不能帮你,因为我不知道它应该做什么。

如果您想要生成一致的随机整数,这是我自己的问题的重复:生成具有一定最大值的一致随机整数,它专注于高效地创建这些整数,而不引入偏见。我建议把我的回答和卢凯的回答结合起来。

票数 3
EN

Stack Overflow用户

发布于 2012-03-24 10:27:15

通过缩放一个双倍的范围[0..1]生成随机整数是很好的,只要生成的双值分布足够均匀。然而,大多数伪随机数生成器,包括Mersenne,本机生成(32位无符号)整数,所以如果我们不需要往返双倍,那就太好了。

如果有界N是2的幂,我们可以首先生成一个32位随机整数X并取X,这保证了得到一个均匀分布的结果。但是,如果N不是2的幂,采用模就会在结果分布中产生偏差(例如,有更多的32位无符号整数X 7大于6 )。如果N是小的,检测这样的偏差将需要大量产生的数字,但理论上,分布将是不正确的。

对于非二次方的N,若要生成在[0.N]范围内真正均匀分布的整数,我们可以采用抽样算法:首先计算M,使其最小幂大于N(N= 13,M= 16等)。然后生成一个32位整数X,计算Y=X,如果Y< N,我们就完成了,Y是我们的数字。如果Y >= N,则丢弃它并生成另一个,直到Y

哪种方法最快?只有侧写才能说明。这取决于硬件、语言和代码的质量。

更深入的讨论可以在Knuth的TAOCP第2部分中找到。

票数 0
EN

Stack Overflow用户

发布于 2012-03-24 09:35:58

您可以使用“Random.Next方法”:

http://msdn.microsoft.com/en-us/library/system.random.next.aspx

您将得到一个非负随机数小于指定的最大值,通过您的供应或给出的数字范围(最小和最大)

致以问候。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9853817

复制
相关文章
Python生成随机整数数组的实用方法
在编程中,生成随机整数数组是一项非常常见的任务。本文将介绍如何使用Python语言来生成随机整数数组,帮助读者掌握这一有用的编程技巧。通过实际的代码示例,我们将逐步指导读者完成生成随机整数数组的过程,并提供一些实际应用的建议。
华科云商小彭
2023/10/09
6740
Python生成随机整数数组的实用方法
Java随机生成前N个不重复的整数
import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Random; /** 测试随机生成前N个不重复的整数 @author Administr
用户7999227
2021/09/23
1.5K0
使用pyplot生成随机漫步
如何用pyplot生成一个随机漫步 先创建一个random_walk.py from random import choice class RandomWalk: # 创建一个RandomWalk类 def __init__(self, points_num): # 随机漫步的步数 self.points_num = points_num self.x_value = [0] # 初始化x的坐标为0 self.y_value = [0
y191024
2022/09/20
2790
使用pyplot生成随机漫步
使用python3来生成安全的随机密码
最近1年自学了python,发现python的应用场景挺多,自己百度了加自己稍微修改,写了段可以随时生成指定长度的安全随机密码 #C:\Python36 #coding=utf-8 import string from random import choice passwd_length = int(input('The length of password: '))        #密码的长度 passwd_count = int(input('The number of password list
py3study
2020/01/06
1.1K0
random生成随机整数 python_python中的random函数
在 Python 中用于生成随机数的模块是 random,在使用前需要 import.
全栈程序员站长
2022/11/09
1.1K0
random生成随机整数 python_python中的random函数
使用js随机生成背景颜色
通过 Math.random() 属性可以随机生成一个数字,然后通过转化为十六进制的方法进行处理,下面就是随机生成 6 位数字的代码,并进行转化的代码。
子舒
2022/06/09
26.4K0
使用js随机生成背景颜色
Numpy使用-随机生成数据
在自己学习pandas和numpy库进行数据处理的过程,有时候会缺乏数据。虽然网上有很多的数据,但是需要时间去查找。
皮大大
2021/03/07
1.2K0
PHP rand() 函数随机整数。
  如果没有提供可选参数 min 和 max,rand() 返回 0 到 RAND_MAX 之间的伪随机整数。例如,想要 5 到 15(包括 5 和 15)之间的随机数,用 rand(5, 15)。
睿儿网络郝刚
2020/09/16
2.6K0
使用Hashtable来检验随机数的随机性
1.首先是创建Hashtable,使用for循环和定义一个产生随机数的r,key值对应随机数的value值。
Java进阶者
2021/12/31
2400
使用Hashtable来检验随机数的随机性
使用mockjs 随机生成模拟接口数据
json-server模拟后端接口 https://cloud.tencent.com/developer/article/1541622
王小婷
2019/11/21
1.6K0
js随机生成一个[min,max]范围的整数,举一反三
如果是想带有小数的随机数,这里提供思路,产生两位数,然后将个位数转化为小数,十位数就是个位数,以此类推,这样就是有小数的啦。
啦啦啦啦
2023/02/27
1.4K0
双倍的分辨率,双倍的快乐
这个工具名为waifu2x,已经开源在GitHub上了,而且随着开源,基于waifu2x的第三方软件也逐渐多了起来,现在已经开发成了普通人也可以使用的软件了。waifu2x的主要功能就是处理动漫风格的图片使之分辨率和清晰度在一定程度上提高,最大提高两倍,因而为2x。
分享者
2022/05/17
3840
双倍的分辨率,双倍的快乐
使用java随机生成验证码
生成验证码图片 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序,可以防止:恶意破解密码、刷票、论坛灌水、有效防止某个黑客对某一特定注册用户,用特定程序暴力破解方式进行不断的登录尝试。实际上验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。 下面我们就来学习如何自动生成一个验证码图片,案例的源代码点击此处进行下载,具体如下:
全栈程序员站长
2022/06/30
1.2K0
使用RANDARRAY生成随机数数组
RANDARRAY函数返回随机数数组,可指定要填充随机数的行数和列数、最小值和最大值、以及是否返回整数或小数值,其语法为:
fanjy
2023/08/30
6290
使用RANDARRAY生成随机数数组
使用 RandomStringUtils 类来生成随机码/随机数 java生成指定范围的随机数
    /*         生成微信账号 8位的字符串 含有数字和字母      */     public String getRandomWeiChat(){         String str = "a0A0b1B2c1C3d2D1e3E2f4F3g5G7h4H6i5Ij4J9k5K6l6Lm7M7n8N8o9Op0PqQrRsStTuUv9VwWxXy8YzZ";         return RandomStringUtils.random(8, str);     }
bear_fish
2018/09/19
4.1K0
PHP生成随机数(昵称随机生成器)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128397.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/28
6.1K1
猜测1-100的随机整数
public static void main(String[] args) {
算法与编程之美
2023/01/03
9040
excel随机生成区间随机数
既然,这个函数只能生成随机整数,那么可不可以生成随机小数了?可以的,本次以随机生成小数点后一位小数为例,先输入公式=RANDBETWEEN(1,9),生成1~9的随机数,再除以10,即可得到这一结果,完整公式如下:=RANDBETWEEN(1,9)/10
似水的流年
2019/12/06
2.5K0
点击加载更多

相似问题

如何使用泊松来估计到达时间(生成随机整数)?

11

生成随机整数

42

生成随机整数

30

随机整数生成

10

使用随机长产生随机双倍

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档