一个骰子有6面,概率均匀,我如何选择7件事?

超级大笨狼 2012-02-07 03:43:11
加精
一个骰子有6面,概率均匀,我有7件事要随机均匀选择,如何扔?

如果我有4件事,5件事,8件事,9件事,10件事,
...n件事要选择,那

么我如何用最少的扔掷次数,来做到均匀分布?
...全文
8622 200 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
200 条回复
切换为时间正序
请发表友善的回复…
发表回复
wood87654321 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 71 楼 fengjian_428 的回复:]

若不想有略过的点数组合 则次数乘以点数种类数量必须是你想要的随机选择事件数量的公倍数
不过题目似乎并没有做这样的限定

理论上来说 只要点数种类数量乘以扔骰子次数的积大于目标随机事件数量 即可
[/Quote]

如果“次数乘以点数种类数量必须是你想要的随机选择事件数量的公倍数”,则扔骰次数已随事件数恒定,所谓“最少”便没有意义了。

如果是现实生活中的问题,则最可能按你70楼的方法,因为原题只要求7件事概率均等,却并没有要求7件事都选不着的概率也和选中某件事相等,但这样也存在问题,那就是扔骰次数也变成了只是在概率上最少,而未必真的最少(运气太差时可能连扔50次都7件事都选不中)。

所以同时满足“最少的扔掷次数”和“均匀分布”的绝对解很可能不存在。
liguangwen86 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 litaoye 的回复:]

扔2次,对应1-36,共36个数,去掉36,然后mod 7,对应那7件事儿。也就是说如果2次扔的都是6,就重来。
[/Quote]

ddd
zhangxuyu1118 2012-02-28
  • 打赏
  • 举报
回复
10进制的7 = 二进制的111,扔3次来确定置1还是置0
ModestMouse 2012-02-25
  • 打赏
  • 举报
回复
第一 你这么得到的是 0-7 共8个数字 第二 概率不平均
[Quote=引用 224 楼 laoluo554 的回复:]

两次
rand() % 6 + rand () % 3 ,头脑一热,好像就搞定了。
[/Quote]
ModestMouse 2012-02-25
  • 打赏
  • 举报
回复

//用一个骰子从n件事中平均选出一种
//解决思路:6进制数字

package com.Jordan.Test;

import java.util.Random;

public class Try_10_DiceFor7 {
public static void main(String []args) {
int things = 7; //37件事需要平均
randomForSeven(things);
}


//先确定需要ROLL几次
public static int randomForSeven(int things) {
int times = 0; //需要ROLL的次数
int maxTimes = 7; //最多ROLL7次,7位6进制数字,很大了O.O
int total = 0; //得到的6进制数字最多能表示多少个10进制数字
int uselessNums = 0; //需要舍去的数字个数;


for(int i = 0; i < maxTimes; i++) {
times ++;
total = (int)Math.pow(6, i+1);

if(total >= things) {
System.out.println("一共需要ROLL"+times+"次~~~");
uselessNums = total - total/things*things;
break;
}
}

Random random = new Random();

int totalTimes = 0; //总共尝试的次数;

for(int i = 0; i < 50; i++) {
totalTimes ++;
int number = 0; //本次ROLL到的数字
int realNumber = 0; //在things范围内得到的有效数字;
for(int j = 0; j < times; j++) {
number += random.nextInt(5)*(int)Math.pow(6, j);
}
number ++;

if(number >= total - uselessNums) {
System.out.println("本次ROLL到的数字为" + number + "不是有效数字,重新来过~~");
continue;
} else {
realNumber = number % things + 1;
System.out.println("ROLL点成功,一共尝试了:" + totalTimes + "次,ROLL到的数字为:" + number + " 判定数字为:" + realNumber);
return realNumber;
}
}
return -1;
}
}

yunyun5866 2012-02-25
  • 打赏
  • 举报
回复
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139683349.html
上海到本溪物流
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139683604.html
上海至大连运输
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139683747.html
上海至铁岭货运
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139699127.html
上海至平顶山运输专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139699322.html
上海到淮北物流快运
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139699463.html
上海到辽宁省物流
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139699617.html
上海到济南货物
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139699749.html
上海至莱芜货运运输
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139699918.html
上海至日照货运专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139700093.html
上海到三门峡物流专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139700248.html
上海至无锡物流
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139700440.html
上海到威海物流专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139700629.html
上海至烟台物流
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139700882.html
上海至商洛货运专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139701036.html
上海到渭南物流专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139701187.html
上海到清远物流专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139701338.html
上海至蚌埠货运公司
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139701504.html
上海至延安物流
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139701682.html
上海到陕西省物流
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139701869.html
上海至吕梁货运公司
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139702048.html
上海到汕尾物流
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139702244.html
上海到武威货运专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139702412.html
上海到运城物流
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139702581.html
上海至成都运输公司
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139702756.html
上海到达州货物运输
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139702953.html
上海到泸州运输专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139703195.html
上海到汕尾物流专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139703358.html
上海到枣庄物流专线
http://www.baidu.com/s?wd=http://b2b.hc360.com/supplyself/139703536.html
上海至眉山货运专线
laoluo554 2012-02-24
  • 打赏
  • 举报
回复
两次
rand() % 6 + rand () % 3 ,头脑一热,好像就搞定了。
Jiao319 2012-02-23
  • 打赏
  • 举报
回复
扔7次,所有的结果加起来对7取模,得到的数为0-6,每一个概率都是1/7.
对于其他的n,扔的次数为n与6的最小公倍数除以6.
wdmcirl 2012-02-23
  • 打赏
  • 举报
回复
我随便说.....扔十二次,第一次把骰子的点数分两组,1~3记为 0 4~6 记为 1 这样无论怎么扔出现0或者1的概率都是1/2 然后再扔一次这次1~6都可能出现 而且都是1/6 把这次真实出现的点数跟前面出现的点数相加 那么1~7 出现的概率都是 (1/2) * (1/6)。

随便说的哈

改正上面:1~3记为 0 4~6 记为 1
wdmcirl 2012-02-23
  • 打赏
  • 举报
回复
我随便说.....扔十二次,第一次把骰子的点数分两组,1~3记为 0 4~6 记为 0 这样无论怎么扔出现0或者1的概率都是1/2 然后再扔一次这次1~6都可能出现 而且都是1/6 把这次真实出现的点数跟前面出现的点数相加 那么1~7 出现的概率都是 (1/2) * (1/6)。

随便说的哈
lala9517 2012-02-23
  • 打赏
  • 举报
回复
比如你有n件事,那么你需要扔m次,其中n<=6^m<=n*6;
然后用骰子代表0-5,6进制表示,共有6^m种可能;
投完m次骰子之后,如果值大于(6^m/n)*n,就重新扔。 //(6^m/n)舍去余数
用最后得到的值mod n
zhimengzhe5 2012-02-23
  • 打赏
  • 举报
回复
不扔,,,,,,
wesweeky 2012-02-23
  • 打赏
  • 举报
回复
扔多个骰子 或者仍多次累加
isea533 2012-02-22
  • 打赏
  • 举报
回复
最小公倍数。。。。。。。。
给我一根雪茄 2012-02-22
  • 打赏
  • 举报
回复
我试了下,好像不可能
mozaiquan 2012-02-22
  • 打赏
  • 举报
回复
扔两次,两次不一样则取前一次的事情(或后一次),两次一样就做第七件事。
养猪大户 2012-02-22
  • 打赏
  • 举报
回复
菜鸟表示赞赏。!
liuwei063608 2012-02-22
  • 打赏
  • 举报
回复

package test;

import java.util.Random;


public class Test1 {

/**
* @param args
*/
public static void main(String[] args) {
int a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0;
for(int i=0;i<700000;i++){
int x= th();
switch(x){
case 1: a1++; break;
case 2: a2++; break;
case 3: a3++; break;
case 4: a4++; break;
case 5: a5++; break;
case 6: a6++; break;
case 7: a7++; break;
}
}
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
System.out.println(a4);
System.out.println(a5);
System.out.println(a6);
System.out.println(a7);
System.out.println(a7+a6+a5+a4+a3+a2+a1);
}
public static int th(){
Random r = new Random();
int now=r.nextInt(6)+1;
int now2=r.nextInt(6)+1;
//some code
int rult=(now-1)*6+now2;
if(rult==36){
th();
}
return (rult-1)%7+1;
}

}

wts 2012-02-22
  • 打赏
  • 举报
回复

http://zhidao.baidu.com/question/115325909.html
抽奖的算法,看看这个能不能有所借鉴?
wingsons 2012-02-22
  • 打赏
  • 举报
回复
那位36哥可以这样说:扔两次,第一次标记A1-A6,第二次B1-B6,A6B6重新扔,剩下35种情况
加载更多回复(180)

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧