主题:随机产生10个30~80的整数,怎么写?
zoa
[专家分:0] 发布于 2006-03-19 20:11:00
同上。
另外,如果要求“包含两端”,和标题的又有什么区别?
回复列表 (共20个回复)
11 楼
moz [专家分:37620] 发布于 2006-03-21 12:40:00
呵呵,希望你有时间再想想,只是别想太远了,没必要。
12 楼
moz [专家分:37620] 发布于 2006-03-21 12:50:00
[color=FF00FF]SRND = ABS( 0.5 - RND )
A = SRND * (最大值-最小值) *2 + 最小值
难道要乘2吗?这样不是偶数吗?整个算式A的值随最小值奇偶。[/color]
这样的确不是偶数,你别要去看那个*2
*2的数是srnd,这是一个纯小数,对你整数的奇偶一点影响都没有。
的确,你可以说那个小数变成了“偶小数”,没有“奇小数”了。
没错,的确是这样子,我说了,那只是牺牲了精度,牺牲了随机的范围,
缩小了一半的范围,或者说得到的随机数少了一半。
其实只是随机数,那少了那一点点问题,能说它不随机或者会影响使用吗?不会的。
又或者:
你的确不忍牺牲太多的随机范围的话,还可以这样:
[b]abs(0.9999999-rnd)[/b]
这样的话,能挽回九成九的随机范围了,就不会损失太多的精度了。
有钻牛角尖的人又会有话说了:
当rnd的值在0.9999998-0.9999999和0.9999999-1之间的时候所得值是重复的,
得到双重机率了,那岂不是对其他值显失公平?就得不到纯正的随机数了。
唉,谁能端一碗水能端得平的?肯定会有所偏袒的,
更何况这只是随机数,有必要计较得那么严重吗?
13 楼
moz [专家分:37620] 发布于 2006-03-21 13:02:00
当然了,对于后面你写的那个方式,当然也没错。
你用了两个随机数,
但并没有扩大了随机的不定范围,
反而更缩小了范围,
(被除数是0-32767,除数是32767.** 除数小数点后面的两三个数字对商的值不会有太多有效的影响,而被除数就已经被限定了个数了,所以这个精度反而变小了)
要扩大随机精度和范围很简单,用多几个rnd就是了,只是没这个必要。
如果你需要扩大范围的话,还会有很多办法,你写的这个方式不能算好。
14 楼
咖啡猪 [专家分:290] 发布于 2006-03-21 14:38:00
我想过0.9999999 但关键是没 1,只是在使用时被变量精度约为 1 了。
再说这跟直接用RND有什么不同
何况它还是牺牲了随机的范围,还有双重问题(重复的范围非常小,几乎可以忽略不计)
而我的方式所牺牲的只是精度(也是范围),虽然被除数没有小数,但只是 0.1/x ,当x足够大时也可以忽略不计且是均匀的。
实质上我所不喜欢的就是没 1 在计算中"理论上太不到最大值"
其实我的方式也有失公平的地方,因为只有分子最大,分母最小时才能有1,即概率为 1/RND*RND ,比其它值的概率要小。
当然我的方式有两个 RND 增加了程序负但,的确不是最优方案。
15 楼
咖啡猪 [专家分:290] 发布于 2006-03-21 14:46:00
我们都把 rnd 想得太理论了,它只能精确到小数点后7位或16位。
其实
[color=FF0000]rnd/0.9999999[/color] 或 [color=FF0000]rnd/0.9999999999999999[/color]
就可以了,当 rnd 为最大值时,就是 1 了
这是不是最佳方案?[em1]
16 楼
moz [专家分:37620] 发布于 2006-03-21 15:11:00
朽木不可雕也。
如果你自己给你自己的方向限定了框架,
那么将不会有人能动摇你的信念。
一方面我们要坚定自己的方向,
另一方面要看清楚反方向的事物,
这样才能不断的完善自己,促进进步。
“我想过0.9999999 但关键是没 1,只是在使用时被变量精度约为 1 了。”
首先这里你要明白1这个值的概念和目的(对于做事和工作是一样的道理)
1在这里只是一个端点值,也就是这个随机数的一个半开半闭区间的一个顶点,
一个最大值,因为这一边是无穷趋向而达不到的一个值(该是极限的概念吧?)
现在讨论的是需要一个开区间,也即是两边能到达的一个点(数轴上的点,某一个值)
为了得到一个从随机数rnd而来的能得到开区间的值
也就是 f(min) < = f(rnd) <= f(max)
1是本身rnd所趋向而达不到的值,是一个最大的极值,
为了能达到极值而使用 abs(0.9999999-rnd)
abs能确使函数值在区间之内,而差值能使函数值两个端点都能到达极值。
在这里,0.9999999就代替了原来的1的最大值的位置,
还使得区间变成了开区间,而牺牲了的所谓的“真正随机含义”微乎其微。
随机数rnd本身是得到一个从0到1的一个半开半闭区间,得到一个纯小数。
需要其他范围的随机数可以在这个区间的基础上延伸扩展开去,
(参照的是rnd在这个区间的位置不定,不定位置)
用0.9999999代替1是同样的道理。对于使用上是没有一点差别的。
好比是如果你需要一个区间 [0,1]
可以使用
abs( 0.9999999-rnd ) / ( 0.9999999/1 )
“即概率为 1/RND*RND ”两个RND在这里是没有意义的。
概率是一个常数,不会含有不定的RND因子的。
如果假设RND只有七位有效数字,也就是说某一个特定值出现的机率是
1 / (1*(10^7)) = 1/10000000
如果用上两个RND,某一个RND值的机率会减少一个次方(特指非0极值)
(1/10000000)^2 = 1/100000000000000
17 楼
咖啡猪 [专家分:290] 发布于 2006-03-22 01:15:00
晕,题都审错了,目的不一样,你所要达到的是"现在讨论的是需要一个开区间,也即是两边能到达的一个点(数轴上的点,某一个值)"
最开始我是说过包含两端,但后面的也说了我的出发点,就是改良随机数以方便应用
要一个包含 0,1 的随机数,不是我限定了框架,只是明确了题目呀
现在你所能达到只是包含了 0 和最大值的,但这个最大值永远只是接近于1但不等于1
难道答案不够准确是题目不对吗?
我知道1在rnd中的意义----"最大值",不就是高数中的极限,无限趋向但不等于吗?
但你知道1在应用中的意义吗?
在前面的算式应用中就可以看出,我所要的srnd是替代rnd不能包含1的
如:求X内的随机数?(包含x)
假如srnd是包含0,1的随机数,则很简单 srnd * X
现在问题就是srnd的算式
abs(0.9999999-rnd)只能说明包含 0 和 0.9999999,在实际运用中没有意义。(不只是我这个应用)
即使这个 0.9999999 代表的是最大值,又有什么意义呢?能做什么应用吗?
再说那跟run有什么不同
不要认为我钻牛角尖,或是思路狭窄非要1,1在应用中比"最大值"更实际更有意义。
18 楼
moz [专家分:37620] 发布于 2006-03-22 11:06:00
你思想太僵化了,我无话可说。
19 楼
wcwp [专家分:0] 发布于 2006-06-04 10:35:00
随机产生10个30~80的整数,要求“包含两端”,即[30,80]
int(rnd*51)+30
随机产生10个30~80的整数,要求“不包含两端”,即(30,80)即[29,79]
int(rnd*51)+29
20 楼
小过 [专家分:0] 发布于 2006-06-06 19:50:00
DIM a(10)
for i = 1 to 10
a(i)=int(rnd*51+30)
next i
end
我来回复