24小时热门版块排行榜    

查看: 1304  |  回复: 8

shugq_2009

新虫 (小有名气)


[交流] 【求助】用rand命令怎么产生各占一半的两个随机点

我现在想用rand命令产生各占一半的1和2两个随机数,我不知道用什么命令实现各占一半,望赐教,谢谢。下面是我产生1和2两个随机数的程序
srand((int)time(0));
for(int i=0;i<10;i++)
{
        printf("%d\n",1+rand()%2);
}
        return(0);
}
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


★ ★
余泽成(金币+2):辛苦辛苦! 2010-12-12 20:59:52
恩,烧死100个脑细胞后,想到一个方法,不过效率不高。
因为rand近似是均匀分布的, 所以你如果需要10个1、2的均匀分布且各占一半的话,不如产生20个,然后从左到右数十个数,计算一下是不是各5个,如果不是,就换下一组。如果满足就返回。如果都不满足,就重新再生成一次。
2楼2010-12-09 18:50:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tjyl

金虫 (正式写手)


★ ★
余泽成(金币+2):谢谢应助! 2010-12-12 21:01:42
我觉得直接LZ那样就行了,从概率上说1+rand()%2的可能只有1,2,其概率都是0.5.
各占一半是从概率上说的,并不是说100个数里面两个数一定得各50个。个人理解,呵呵。
int rand_two(void)
{
       return 1+rand()%2;
}
引用回帖:
Originally posted by holmescn at 2010-12-09 18:50:09:
恩,烧死100个脑细胞后,想到一个方法,不过效率不高。
因为rand近似是均匀分布的, 所以你如果需要10个1、2的均匀分布且各占一半的话,不如产生20个,然后从左到右数十个数,计算一下是不是各5个,如果不是,就 ...

3楼2010-12-11 23:24:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)



余泽成(金币+1):鼓励讨论! 2010-12-12 21:02:00
引用回帖:
Originally posted by tjyl at 2010-12-11 23:24:33:
我觉得直接LZ那样就行了,从概率上说1+rand()%2的可能只有1,2,其概率都是0.5.
各占一半是从概率上说的,并不是说100个数里面两个数一定得各50个。个人理解,呵呵。
int rand_two(void)
{
       return 1+r ...

我觉得是你没理解LZ的意思(要不就是我没理解对)
LZ想要一组数, 1 和2在里面均匀分布,且个数正好是各占一半。

虽然LZ的算法在理论上成立,但不能满足各占一半这个要求。
所以我认为我的算法,虽然效率不高,但能够满足这两点要求。
4楼2010-12-12 12:30:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tjyl

金虫 (正式写手)



余泽成(金币+1):鼓励讨论! 2010-12-12 21:04:09
你这样很可能永远无法取得想要的结果的。 rand的结果是无法预测的。
引用回帖:
Originally posted by holmescn at 2010-12-12 12:30:04:



我觉得是你没理解LZ的意思(要不就是我没理解对)
LZ想要一组数, 1 和2在里面均匀分布,且个数正好是各占一半。

虽然LZ的算法在理论上成立,但不能满足各占一半这个要求。
所以我认为我的算法,虽然效 ...

5楼2010-12-12 13:12:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

余泽成(金币+1):欢迎新虫,谢谢参与应助! 2010-12-12 21:04:40
这个可以用MATLAB,很简单的
rand(m,n)>0.5+1
就可以产生m行n列的1,2随机数,LZ就在生成的数组里找一个符合要求的行或列就可以了
如果想用C生成,建议用MersenneTwister随机数,功能超级强大,什么类型的随机数都可以生成
6楼2010-12-12 16:43:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

余泽成(金币+1):常来程序语言版! 2010-12-12 21:04:59
应该是(rand(m,n)>0.5)+1
刚才我是了一下:
a=(rand(m,n)>0.5);
b=sum(a);
a=a+1;
选择b=5的那一列就可以了,省得LZ一个一个找了
7楼2010-12-12 16:50:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


CODE:
#include
#include
#include
int getrand(int* a, int n)
{
    int b[50];
    int c = 0;
    int idx = 0;
    memset(b, 0, 50*sizeof(int));
    srand(time(0));
    for(int i = 0; i < 50; i++)
    {
        b[i]=(int)(rand() % 2) + 1;
    }

    for(int i = 0; i < 50 - n; i++)
    {
        c = 0;
        for(int j = i; j < i + n; j++)
        {
            if(b[j] == 1)
                c++;
        }
        if(c == 5)
        {
            idx = i;
            break;
        }
    }

    memcpy(a, b+idx, n*sizeof(int));
    return idx;
}

对代码进行1千万次调用,耗时30秒,idx的期望大约在4~8这个范围。
8楼2010-12-14 12:57:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

stephenliu89

银虫 (小有名气)


引用回帖:
Originally posted by shugq_2009 at 2010-12-08 13:52:08:
我现在想用rand命令产生各占一半的1和2两个随机数,我不知道用什么命令实现各占一半,望赐教,谢谢。下面是我产生1和2两个随机数的程序
srand((int)time(0));
for(int i=0;i<10;i++)
{
        printf("%d\n ...

替楼主写了个
#include
using namespace std;
int list[ 5000 ];
int n;
void rand2()
{
    int sum,  i;
     
    do
    {
         cout <<"请输入正偶数n:" << endl;
         cin >> n;
    }
    while( n <= 0 || n % 2 != 0 );//判断n为正偶数,否则重新输入
    do
    {
       sum = 0;
       for ( i = 0; i < n; i++)
       {
          list [ i ] = rand() % 2;
          sum +=  list [ i ];
          list [ i ] += 1;
       }  
    }
    while ( sum != n / 2 );     
}
int main()
{
    int i;
   
    rand2(); //执行rand2函数
    cout <<"随机结果:\n";
    for ( i = 0;i < n ; i++ )
       cout << list[ i ] << endl;  //输出产生的结果
    system("pause";
    return 0;
}
9楼2010-12-15 14:17:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 shugq_2009 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 材料工程专硕274一志愿211求调剂 +5 薛云鹏 2026-03-15 5/250 2026-03-15 20:38 by Logic2024
[考研] 0703化学调剂 290分有科研经历,论文在投 +3 腻腻gk 2026-03-14 3/150 2026-03-15 17:28 by 小物理化学
[考研] 085601材料工程315分求调剂 +3 yang_0104 2026-03-15 3/150 2026-03-15 10:58 by peike
[考研] 材料与化工 323 英一+数二+物化,一志愿:哈工大 本人本科双一流 +4 自由的_飞翔 2026-03-13 5/250 2026-03-14 19:39 by hmn_wj
[考研] 297一志愿上交085600求调剂 +5 指尖八千里 2026-03-14 5/250 2026-03-14 17:26 by a不易
[考研] 331求调剂(0703有机化学 +5 ZY-05 2026-03-13 6/300 2026-03-14 10:51 by Jy?
[考研] 266求调剂 +4 学员97LZgn 2026-03-13 4/200 2026-03-14 08:37 by zhukairuo
[考研] 一志愿浙江大学0856材料与化工求调剂 +4 yansheng@211 2026-03-09 5/250 2026-03-14 02:10 by JourneyLucky
[考研] 考研材料与化工,求调剂 +8 戏精丹丹丹 2026-03-09 8/400 2026-03-14 01:14 by JourneyLucky
[考研] 材料工程专硕,一志愿中国矿业大学,总分314,求调剂 +5 无懈可击的巨人 2026-03-10 5/250 2026-03-14 00:37 by JourneyLucky
[考研] 2026考研调剂+本科延边大学+山东大学+生物化学与分子生物学+有项目经验 +3 ccdsscjy 2026-03-10 3/150 2026-03-14 00:12 by JourneyLucky
[考研] 311求调剂 +8 zchqwer 2026-03-10 8/400 2026-03-14 00:01 by JourneyLucky
[考研] 279求调剂 +3 抓着星星的女孩 2026-03-10 3/150 2026-03-13 23:47 by userper
[考研] 341求调剂 +4 番茄头--- 2026-03-10 4/200 2026-03-13 23:12 by JourneyLucky
[考研] 四川大学085601材料工程专硕 初试294求调剂 +4 祝我们好在冬天 2026-03-11 4/200 2026-03-13 21:39 by peike
[硕博家园] 085600 260分求调剂 +3 天空还下雨么 2026-03-13 5/250 2026-03-13 18:46 by 天空还下雨么
[考研] 302求调剂 +6 负心者当诛 2026-03-11 6/300 2026-03-13 16:11 by JourneyLucky
[考研] 070303一志愿西北大学学硕310找调剂 +3 d如愿上岸 2026-03-12 5/250 2026-03-13 10:56 by houyaoxu
[考研] 290求调剂 +3 ADT 2026-03-13 3/150 2026-03-13 10:19 by peike
[考研] 293求调剂,一志愿陕师大生物学 +3 ??????.?.??? 2026-03-09 3/150 2026-03-11 10:02 by 学员8dgXkO
信息提示
请填处理意见