随机100次,范围1-5问题!

NucleusCode 2012-09-29 10:22:59
随机范围 1 - 5;

随机100次

要求随机出的100次一定要包含 1 - 10 个数字。

比如 随机出 10个1, 8个2, 12个3, 5个4, 65个5;

但是不可以出现 0个1, 或者 0个2……

一定要把 5 个数字全部随机出来
但是次数随便
总和要100次。

如果直接控制随机范围,随机100次的话, 有很小的几率会出现只随机出了 1 - 4 而 5 (这里也可能是别的数字)没有被随机出这种可能性。

求解!
...全文
216 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
NucleusCode 2012-09-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

如果消除了这种小概率,就不叫随机了。
[/Quote]

是有点扭曲,,,
但是要求 必须5个数字每个都要随机出来,只是每个数字随机出多少个可以随便,头疼啊...

卖萌de猫 2012-09-30
  • 打赏
  • 举报
回复
如果消除了这种小概率,就不叫随机了。
hyp41226 2012-09-30
  • 打赏
  • 举报
回复
模运算,结果+1
NucleusCode 2012-09-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:
以5取模

1-5
以5取模,记整除的为5
[/Quote]

rand()%5 ;
这样只能保证随机范围 是在 5 以内
但是不能保证 他随机100次 会把 5个数字都随机出来把...
比如随机100次 只随机出 4 个数字 还一个数字一直没随机到 ,,,
虽然这种可能性非常微小

Gloveing 2012-09-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
以5取模
[/Quote]
1-5
以5取模,记整除的为5
AndyZhang 2012-09-30
  • 打赏
  • 举报
回复
既然随机,何必控制
既然控制,何必随机
Gloveing 2012-09-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

如果消除了这种小概率,就不叫随机了。


是有点扭曲,,,
但是要求 必须5个数字每个都要随机出来,只是每个数字随机出多少个可以随便,头疼啊...
[/Quote]
楼主可以对随机值进行过滤。。
kakaximodo 2012-09-30
  • 打赏
  • 举报
回复
楼主可以这样
把你随机得出的100个数记录下来
求出最大和最小之间的差,平均分成5段
100个结果落在第一段里代表1,落在第二段代表2,以此类推
huangxy10 2012-09-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

如果消除了这种小概率,就不叫随机了。


是有点扭曲,,,
但是要求 必须5个数字每个都要随机出来,只是每个数字随机出多少个可以随便,头疼啊...
[/Quote]
思路1:
先每个数字都给一个,再随机95次就好了。
按题目要求每个数字都出现,所以这前五个数字就具有确定性,而不具有随机性了。
所以直接给出来也是对的。

思路2:
先随机100个数,再统计1-5出现的次数,
如果有出现次数等于0的,那个找出出现次数大于2的数,
从这几个数字中再随机取一个转移到出现次数为0的情况就好了。

#include <cstdlib>
#include <vector>
#include <iostream>
#include <iomanip>
#define N 5
using namespace std;

int count[N]={0,0,0,0,};

void random1()
{
for( int i=0; i<N; ++i)
{
count[i]=1;
}
for( int i=0; i<100-N; ++i)
{
count[rand()%5]++;
}

}

int zero_index()
{
for( int i=0; i<N; ++i)
{
if( count[i] == 0)
return i;
}
return -1;
}

void random2()
{
for( int i=0; i<100; ++i)
{
count[rand()%5]++;
}

int index=0;
while( index=zero_index(), index!=-1) //如果有0的情况
{
vector<int> more_than2;
for( int i=0; i<N; i++)
if( count[i]>=2) more_than2.push_back(i);

count[index]++;
count[more_than2[rand()%more_than2.size()]]--; //多余2个的中的一个数的个数减去1,也是随机的
}
}

int main()
{
srand((unsigned int )time(0)); //加随机种子
// rondom1();
random2();
for( int i=0; i<N; i++)
cout <<"Number " << i+1 << " : " << setw(3) <<count[i] << endl;
return 0;
}
Gloveing 2012-09-29
  • 打赏
  • 举报
回复
以5取模

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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