怎么让随机的一个matlab定义变量为整数是整数

C++ 如何生成大随机数? - 知乎148被浏览16393分享邀请回答int __cdecl rand (
_ptiddata ptd = _getptd();
return( ((ptd-&_holdrand = ptd-&_holdrand * 214013L
+ 2531011L) && 16) & 0x7fff );
就是一个线性同余随机发生器输出是取除最高位的高 15 位的结果(32 位整数先右移 16 位,再取低 15 位)。下面的讨论如果涉及具体范围,我们就假定 RAND_MAX 是上面的 32767。这种伪随机数两个拼起来,统计性质多少会所下降——至少我们知道重复周期会变短为原来的一半对吧。不过,经过适当选择迭代常数的线性同余算法,其高维联合分布的性质仍然是可接受的——这本来也是选择伪随机数算法参数的一个重要指标。VC 这里使用的库函数,实际就是 Intel 推荐的一个具体实现,简单分析可以看:从上面的二维直方图可以看出,这个函数的二维分布也可以通过直方图检验,因而像你说的这样使用没有大的问题。当然,应该是把两个 15bit 的随机数拼合成一个 30bit 的来使用。从上面的二维直方图可以看出,这个函数的二维分布也可以通过直方图检验,因而像你说的这样使用没有大的问题。当然,应该是把两个 15bit 的随机数拼合成一个 30bit 的来使用。在实践中,现代编译器所选择的运行时库,伪随机数发生器的质量都还不错,这与多年前的情况不大一样。当然,如果是对随机数要求比较高的场合,还是应该做更完整的测试或者选择更好的随机数发生器。但是等等,只要不溢出,这样当然可以取得很大的随机数,但却并不能取得我们需要的随机数。因为我们实际中使用的随机数范围,通常不会那么巧合就是
区间的整数,也不会是
区间的整数。我们需要的,可能是 [100, 155] 之间的整数,也可能是 [5.0, 27.0] 之间的浮点数。也就是说,rand() 函数得到的随机数只是固定区间上均匀分布的整数,我们需要把它映射为指定区间上指定分布的指定类型的随机数。这怎么办?指定分布涉及随机变量的数学变换,我们暂且放在一边。如果就是均匀分布,如何?对于均匀分布的整数,比如说 [100, 155],起点不是 0,终点也不是 RAND_MAX,怎么办?起点不是 0 好办,只要做一个加法平移,[0, RAND_MAX] 区间自然就变换为 [a, RAND_MAX+a] 区间了。但区间长度不同,一个是 155-100+1 = 56,一个是 RAND_MAX+1 = 32768,就需要放缩。人们对区间放缩想出了一些不同的办法,最简单的办法是取模。比如说,100 + rand() % 55 就是一个可以把 rand() 映射到 [100, 155] 区间上的一个办法。取模的办法虽然简单,但并不准确,因为你不能把 32768 按 56 长度等分(32768 / 56 = 585 余 8),那么必然最后一些数字比前面的出现概率要小一点——准确点儿说,前面 8 个数出现的概率是 586/32768,后面 48 个数出现的概率是 585/32768,后面的比前面的出现概率小 1/32768。为了避免这种问题,一种准确的办法就是,取到 rand() 为 [0, 32767] 区间内的整数后,先判断它是否超过 585*56=32760,如果超过了就舍去它重新取 rand(),否则才对 rand() 值取模(或者除以 585),得到准确均匀分布的随机数。——这种舍弃、重取的机制在理论上可能导致算法不终止,因为有可能每次随机数发生器总返回需要舍弃的数,但算法终止的概率随着步骤数而趋于 1(对于算法生成的伪随机数一定在有限步终止),并且只要舍弃的数比保留的数少,就能知道需要重复的步骤数期望小于 2。因而这是一个实用的算法,如 gcc 使用的 libstdc++ 库,大约就使用这种方式(见下节)。上面没有说清楚的是,如果 RAND_MAX 比需要的区间长度还小,那么就需要回到最开始的问题了:可以用两个、三个或更多的 rand() 函数,通过 (RAND_MAX+1) 进制数表示的方式拼合成一个大的随机数。前面已经说了这个大的随机数的分布实际就是几个小随机数的联合分布,也是均匀的。于是我们把新问题化归为一个已知的问题。浮点数的问题看起来稍显复杂。注意到机器浮点数的乘法放缩是准确的(误差最小),因此 [a, b) 区间的浮点随机数 x 是可以通过 [0, 1) 区间的浮点随机数 u 做线性变换得到,即 x = a + u * (b - a)。因此只要能生成 [0, 1) 区间的浮点随机数 u 就可以了。如果再知道 IEEE 754 标准中浮点数的定义,就知道一个浮点数由符号位、指数、尾数构成。如果符号位和指数均为 0,尾数部分就恰好是 [0, 1) 区间的数。因此一个 [0, 1) 区间的浮点数就是一个尾数位数的整数。例如对于双精度浮点数,尾数是 52bit,因此可以生成一个
区间的随机整数作为浮点数的尾数,就得到 [0, 1) 区间的随机浮点数。我们就又把问题化归为已知的问题了。做为餐后甜点,我们来看看另一个求 [a, b] 区间整数的办法:先生成一个 [0, 1) 区间的浮点数,然后用它来生成 [a, b+1) 区间的整数,最后用一个 floor 向负无穷大取整。在数学上,这个办法无懈可击(注意对于概率,开区间和闭区间并不影响)。Knuth 在 TAOCP 中就是这样描述随机区间生成方式的。但在现实中这样则不够准确,因为我们知道,所谓 [0, 1) 区间的双精度浮点数,其实只是一个 52 比特的整数而已,用它计算区间长度小于
的随机整数时,因为不能等分区间,就会造成不准确;而用它计算区间长度大于的随机整数时,还会因为区间不够大,会有一些数永远取不到。求固定区间浮点随机数时,我们追求的只是误差最小;而求随机整数时,我们就有理由追求完全准确了。另一个求 [a, b] 区间随机整数的常见用法是写x = a + (double)rand() / (RAND_MAX + 1) *这个办法其实就是前面说的先求 [0, 1) 区间浮点随机数,再线性映射到整数区间的办法,只是 RAND_MAX 通常没有
52bit 之多,因此精确度还不如前面的方法高。——更准确地说,这个方法的精确程度其实和直接取模差不多是一样的,只是概率较大和较小的数变得分散了一些而已。=====================================================================因为随机数生成器的使用对于大多数缺少相关专业知识的人来说是比较难的,在 C++ 11 标准中,又增加了 &random& 头文件,专门用来生成各种分布随机数,也可以更换其中的随机数发生器源。如果你使用支持 C++11 标准库的新版本的 VC、GCC、Clang 等编译器,就可以参考
来使用相应的函数。一方面,你可以不必考虑固定整数范围的基本的随机数源怎么用,直接使用 uniform_int_distribution 和 uniform_real_distribution 类来生成指定范围的随机整数或浮点数。另一方面,你也可以在使用 uniform_int_distribution 之类伪随机数类生成随机数时,选择内部状态空间更大、周期更长的发生器,如 mt19937(有 19937bit 状态空间)之类。甚至是基于硬件的真随机数发生器 random_device。875 条评论分享收藏感谢收起12添加评论分享收藏感谢收起查看更多回答1 个回答被折叠()如何将一个中文变量与一个随机数值的变量定义为同等值【php吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:136,999贴子:
如何将一个中文变量与一个随机数值的变量定义为同等值收藏
代码如下&?php$cc=1234;/*固定数值*/$wz=&中文字&;$sz=1234;/*随机数值*///如何将这两个变量定义为相等的一个变量。$a=($wz==$sz);if($cc==$a)echo &相等&;elseecho &不相等&;?&这个程序不行,怎么样才能让中文字变量与一个随机数字的变量定义成相等。求大神解答,在线等
登录百度帐号推荐应用本帖子已过去太久远了,不再提供回复功能。EXCEL中怎样才能实现“不重复!”随机取某区间的整数
如果要用不重复,就很难了, 用ACCESS可以实现。
excel随机选取区间数据的函数是
RANDBETWEEN(bottom,top)
函数 RANDBETWEEN 将返回的最小整数。
函数 RANDBETWEEN 将返回的最大整数。
如果这个函数不好用,你也可把RAND函数改造一下,先乘某数,然后再截取整数部分。
如果用ACCESS可以使用Randomize 语句
例如:Randomize 语句示例
本示例用 Randomize 语句初始化随机数生成器。由于忽略了数值参数, 所以 Randomize 用 Timer 函数的返回值作为新的随机数种子值。
Dim MyValue
' 对随机数生成器做初始化的动作。
MyValue = Int((6 * Rnd) + 1)
' 生成 1 到 6 之间的随机数值。
你可以配合其他执行过程进行编辑。我就利用此函数制作了一个双色球彩票选号器,很...
如果要用不重复,就很难了, 用ACCESS可以实现。
excel随机选取区间数据的函数是
RANDBETWEEN(bottom,top)
函数 RANDBETWEEN 将返回的最小整数。
函数 RANDBETWEEN 将返回的最大整数。
如果这个函数不好用,你也可把RAND函数改造一下,先乘某数,然后再截取整数部分。
如果用ACCESS可以使用Randomize 语句
例如:Randomize 语句示例
本示例用 Randomize 语句初始化随机数生成器。由于忽略了数值参数, 所以 Randomize 用 Timer 函数的返回值作为新的随机数种子值。
Dim MyValue
' 对随机数生成器做初始化的动作。
MyValue = Int((6 * Rnd) + 1)
' 生成 1 到 6 之间的随机数值。
你可以配合其他执行过程进行编辑。我就利用此函数制作了一个双色球彩票选号器,很好用。
其他答案(共1个回答)
我看了你的表,明白你的意思是要生成1——10之间的整数随机数。但你说要根据已经有的一列数,这我就不明白了。因为无规律的随机数不应该和已给的随机数有关。否则又怎么...
rndrnd函数的一种1、Rnd函数 返回一个包含随机数值的 Single语法Rnd[(number)]如果 number 的值是 Rnd 生成小于 0 每次都...
0~19,希望对你有帮助。
应该可以。你试试,不行发消息Dim a(1 To 20) As IntegerPrivate Sub Command1_Click()Print "20个随机数...
解决方法:1、先输入半角逗号“'”,再输入超过12位数字。2、先选中单元格,“格式/单元格/数字/分类/文本/确定”,再输入超过12位数字。3、先输入“=""”...
答: 试用商品后无法写试用报告! 问题微软谔谔哇微软的
答: 好在有许多成熟的安全和网络技术,例如虚拟私有网络(VPN)和防火墙等,能够极大地提高Web服务应用的安全和性能,让开发者拥有选择安全技术的自由,而不是非得使用尚...
答: 某些ADSL调制解调器使用USB接口与电脑相连,需要在电脑上安装指定的软件以添加虚拟网卡来进行通信
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415

我要回帖

更多关于 整数类型变量 的文章

 

随机推荐