作者aiweisen (鲁‧排骨宅)
看板java
标题[问题] Random 的范围到底多大?
时间Wed Sep 9 15:27:16 2015
各位前辈你们好
是这样子的 目前我要去制作10%~90%的机率出来
原本的方式是这样
假设是要制作10%的机率 那就是准备一个阵列 阵列里面装有1个1、9个0
执行的时候 每次使用Math.random()的方式从阵列内取值 每次都会记录取几次才成功
然後只要一成功 就开始执行下一次 总共执行100次
但被老师打枪说这样的机率根本不是10%
就好比 硬币有50%的机率都是正面跟反面 我们要求产生50%的正面
那执行10次能保证说 正反面出现的次数一样吗? 可能刚好10次都是反面
所以要一直掷骰子 掷到正反面出现的次数一样才行
最後我们老师提出两种方式
1.增加执行次数 让他趋近於10%
也就是原本的方法 不要只执行100次 要执行到1万 10万 甚至是100万次
这个样本数才够足以证明10%
2. 增加random范围
假设java的random范围是-9999999~9999999
切个10个区域 若random出来的结果刚好就落在指定的区域
那就是算成功的10% 成功後就继续执行下一笔 然後执行100次
第一个要做比较容易
但第二个我就有问题了
我找到的资料是
Math.random()好像是0~0.9999999(无穷小数)
而Random rnd = new Random()这个方法
一般是直接喂seed 告诉random中从seed随机取一个值
但是 我找不到说 在没有喂seed情况下 Random的范围是多大
请问 有人知道怎麽算说 Random的范围是多大?
还是说Random跟Math.random()一样 范围都是无穷大?
--
作者 MicroGG (La new总冠军) 看板 Japan_Travel
标题 [问题] 温泉旅馆的儿童人头算法?
1F:→ robler:问问题然後自称拎背这样好吗 有点礼貌ok?04/11 16:32
2F:→ penan:骨科大 XD04/11 16:34
3F:→ MicroGG:你不懂,我有苦衷,我不说拎杯会被乡民骂..04/11 16:36
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.138.150.27
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1441783643.A.BD2.html
4F:→ cowbaying: 0.0~1.0 09/09 15:56
5F:→ ssccg: 每次都刚好一样,就不叫随机了,先确定你的需求... 09/09 16:09
听不太懂你的意思 请容许我跳针一下
目前就是client会固定一个时间(例如每5s或30s...等等)去向server做查询的动作
但是client不一定每次都会上线
所以要做一个假设说 假设10%的机率client会上线做查询 那麽须要花多久时间?
现在就是卡在说 要怎样做出那个10%的机率 才是真正符合那所谓"10%"机率的上线可能
※ 编辑: aiweisen (140.138.150.27), 09/09/2015 16:28:13
6F:→ ssccg: 至於random的范围 09/09 16:19
7F:→ ssccg: docs.oracle.com/javase/8/docs/api/java/util/Random.html 09/09 16:20
8F:→ ssccg: Math.random就是Random.nextDouble,其他的上面都有写 09/09 16:20
9F:→ ssccg: new Random一般是"不"喂seed,上面也有写会用一个重复机率 09/09 16:22
10F:→ ssccg: 很低的seed,自己设seed是要产生重复结果时才会用 09/09 16:23
11F:→ ssccg: 范围跟seed没关系也不是无穷,数位资料值域都是有限的 09/09 16:25
一般Random好像都是搭配nextInt()来使用
那麽范围就是依照nextInt()的 2^32 是麻?
※ 编辑: aiweisen (140.138.150.27), 09/09/2015 16:34:27
12F:→ ssccg: 如果你相信java的实作,那nextInt(10)结果就是0~9机率各10% 09/09 16:43
这我就不懂了
那跟我直接在阵列里面放10个值 然後用Random去跑 去抓里面其中的特定的值
跟直接nextInt(10)会一样嘛?
13F:→ ssccg: 如果你说的是 array[new Random().nextInt(10)] 那一样 09/09 17:04
抱歉 刚打到一半同学被拖走
虽然说nextInt(10)每个出现的机率都是10% 但是这个问题後面就会跟硬币一样
硬币出现正反两面的机率是50% 但是要掷出多少次的硬币 使出现"正面" 的机率是50%?
我是要制作後面的50%
话说回到new Random() 请问他的范围是0~2^32-1吗?
※ 编辑: aiweisen (140.138.238.19), 09/09/2015 18:20:57
14F:推 LPH66: 你去把你刚才提的投硬币这个例子丢回去给你们老师 09/09 19:41
15F:→ LPH66: 说起来, 谁规定 10% 一定是每十次要有一次? 09/09 19:42
恩 所以才会说10%的机率下可能会24次才会中一次 5次才会中一次 也有可能一次就中
这些24次 5次 都是有包含前面23次的失败跟4次的失败
才会提到说 执行这10%的机率要作很多组
假设做1万组 总共花了86953次 其中一万次是成功 其他失败是76953次
那是不是就可以说成功的机率大概是 10000(成功次数)/85953(总次数)=11.5%
16F:→ LPH66: 回到你的 Random() 问题, 你把随机数引擎跟取值混在一起了 09/09 19:44
17F:→ LPH66: new Random() 是做出一个随机数引擎 09/09 19:44
18F:→ LPH66: 你要怎麽取乱数是 nextXxx() 在取的 09/09 19:44
19F:→ LPH66: 你可以 new 一个 Random 物件然後从中取整数/取浮点数/etc. 09/09 19:45
20F:→ LPH66: 所以「Random() 的范围」这问题根本问错方向了 09/09 19:46
21F:→ LPH66: 最後我觉得你找个时间跟你们老师好好谈谈他到底在讲什麽 09/09 19:50
22F:→ LPH66: 不然我们这边给了一堆建议如果又被你们老师打枪不就囧了 09/09 19:50
23F:→ LPH66: 对他提的方法有问题就去问他, 我们不可能懂他在想什麽 09/09 19:51
24F:→ lucky1lk: Random的范围多大 跟你问的问题根本不相关... 09/09 19:52
25F:→ LPH66: 多嘴一句, 你可以查查「先验机率」跟「後验机率」这两个词 09/09 19:53
好 明白了
26F:→ lucky1lk: Random的范围多大 看你的型别 09/09 19:55
所以就是看对象是 int long double 这些的范围是吗?
27F:→ ssccg: 出现正面的机率50%的情况下,出现正面的"次数"是50%的机率 09/09 20:02
28F:→ ssccg: 是C(n,n/2)0.5^n,这值不会是100% 09/09 20:06
29F:→ ssccg: 你要"次数"是50%,那根本就不需要随机,准备好结果就好啊 09/09 20:08
我不晓得有没有误会你的意思
以这个为例 你的意思是说 我就一直给他跑数据
跑到刚好出现正面的次数刚好是占所有次数的一半就可以停止了 是吗?
例如 1024(出现正面的次数)/2048(所有正反面的次数)
※ 编辑: aiweisen (140.138.238.19), 09/09/2015 21:00:57
30F:推 ooooooo: 看不懂你所谓的"成功"是什麽 不过我猜你要的是shuffle 09/09 21:35
我所谓的成功就好比是指
一直掷硬币 总共掷了几次硬币 才会出现一个正面 然後纪录次数 再做下一轮
话说 什麽是shuffle?
※ 编辑: aiweisen (140.138.238.19), 09/09/2015 22:54:17
31F:→ ooooooo: 以10%机率来说,我感觉你要的是 10次必定要出现1次 09/10 00:20
32F:→ ooooooo: 那就可以想成拿10张扑克牌洗牌 每次抽奖就是取走一张牌 09/10 00:21
33F:→ ooooooo: 这样就可以保证 10次中必定中1次 09/10 00:22
所以我不确定我原本的想法是不是正确的
拿原本的例子套用在你这 也就是说
扑克牌有A、2、3...10共10张 每张牌取的机率都一样
请问要取几次牌才会使A刚好是占全部次数的10%?
34F:推 k47100014: 假设你client有1000个,你随机挑100个不就是10%了吗 09/10 02:12
35F:推 k47100014: 不是每个client都用10%机率下去抽而是用总数的10%下去 09/10 02:15
36F:→ k47100014: 挑client,不知道这样有没有符合你的条件 09/10 02:15
应该说没以要先扩大 就一个server跟一个client
但这边也是我问题的其中之一
更原始的要求的是
「client 会固定一个时间向server查询资料,但是server有10%的机率会上线.如果查询
的时候server没上线,这个时候client就会再等待下一个固定时间,再去向servert查询,
一直重复到server开启,最後统计总共花多少时间」
所以我的演算法大致上如下
计数=0
10%阵列={1,0,0,0,0,0,0,0,0,0}
for(执行100次){
继续=true
while(继续){
乱数值=产生乱数0~9
计数加1
if(10%阵列[乱数值] is 1){
继续=false
}
else{
skip
}//if else end
}//while end
}//for end
但是最後就老师被打枪 然後举前面掷硬币的例子给我听
所以就会觉得奇怪的是 以上面的「更原始的要求」那边来看
我不知道是不是看的角度不同 那个10%的机率是指
1.假定好server上线的机率为10%,由这个机率去跑数据 (这是我最原始的作法)
2.server只有上线或不上线两种可能,client要查询多少次才发现server上线的机率为10%
但现在老师提供的第一种方式 好像是有点混合我1、2这两个角度
也就变成
假定好server上线的机率为10%,然後client要查询多少次才发现server上线的机率为10%
老师讲到这 就又开始举掷骰子的例子了==
但这样会符合上面的「更原始的要求」的题目吗?
※ 编辑: aiweisen (140.138.238.19), 09/10/2015 09:58:34
37F:推 cyclone350: 所以你做了一百次的结果是几%? 09/10 10:00
38F:推 ctrlbreak: 不讨论题目, Java的乱数是平均的乱数, random1~10 出现 09/11 18:00
39F:→ ctrlbreak: 1的机率就是10%了.. 09/11 18:01
40F:推 k47100014: 原来是server的上线机率阿...但要怎麽去定义Server机率 09/11 22:48
41F:→ k47100014: ?一天24HR,Server上线2.4小时?因为如果Server没开,所 09/11 22:49
42F:→ k47100014: 有的Client都无法查询到资料,还是你要以五分钟作时间 09/11 22:50
43F:→ k47100014: 区隔,一天就有288次测试,10%的话就是28.8次上线区段 09/11 22:50
44F:→ k47100014: 你上面那段程式码 是以程式内建的乱数去跑上线机率 09/11 22:52
45F:→ k47100014: 如果A Client在十二点的时候开始测试,他每五分钟Test 09/11 22:53
46F:→ k47100014: 一次,B Client在十二点半的时候开始测试,一样五分钟 09/11 22:53
47F:→ k47100014: Test一次,而Server在十三点整开启,所以A会测试12次 09/11 22:54
48F:→ k47100014: B会测试六次。机率之所以是机率就是因为我们不知道接下 09/11 22:55
49F:→ k47100014: 来会发生甚麽事情,没办法真的去定义玩美的10% 09/11 22:55
50F:→ realmeat: 你可以用 rand%10 .... 09/16 13:51
51F:→ realmeat: 不过你的题目我看不懂 09/16 13:53