24小时热门版块排行榜    

查看: 1590  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 今天系统多次维护,明天很可能放榜! +6 zju2000 2026-08-16 6/300 2026-08-17 10:01 by xter9665
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +10 Ldrop2023 2026-08-13 10/500 2026-08-17 09:59 by 小豌豆_发芽
[教师之家] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +3 6GojgJvkDudM 2026-08-16 3/150 2026-08-17 09:49 by xLVPIRuSvCUe
[基金申请] 2027广东省杰青 +3 奶牛小黑 2026-08-15 6/300 2026-08-16 20:07 by 奶牛小黑
[基金申请] 快农历七夕节了,轻松一下,男人悄悄话,女施主请不要进来。 +3 Tide man 2026-08-14 3/150 2026-08-16 17:47 by jurkat.1640
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +7 启萌科技 2026-08-12 26/1300 2026-08-16 12:35 by 启萌科技
[基金申请] 我的国基提前知道中了,可是同事的操作让我实在接受不了,怎么会有这样的人 +11 家与远方 2026-08-10 16/800 2026-08-16 10:28 by ray43
[基金申请] 有时候,自然基金真的不能太认真 (我的申报经验) +10 majunge000 2026-08-11 12/600 2026-08-16 08:18 by xli1984
[精细化工] 招聘 金属平磨液,抛光液研发工程师 +3 小天0311 2026-08-14 3/150 2026-08-16 07:31 by H9PLUS
[基金申请] filecode=后面第一个是大写字母 +6 wangze12014 2026-08-14 7/350 2026-08-15 20:12 by gltch
[基金申请] 关于Filecode分析方法 +10 majunge000 2026-08-10 13/650 2026-08-15 12:26 by hanpeng972
[基金申请] 各位道友,我要去昆明玩几天,回来见。 +7 Tide man 2026-08-14 8/400 2026-08-15 01:11 by arzu_hma
[基金申请] 是这周出结果还是下周出结果? +4 yuleib84 2026-08-11 4/200 2026-08-14 23:05 by lfy8008
[基金申请] 静等基金结果 +8 gjjjzhong 2026-08-10 21/1050 2026-08-13 17:56 by 且听虎啸
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] Filecode 又变了,巨变 +3 WH3796 2026-08-12 4/200 2026-08-13 14:13 by 小木虫6752397
[基金申请] 结合人工智能,周易传统文化,filecode打分制来了,3分以上希望很大。 +3 Tide man 2026-08-12 4/200 2026-08-13 08:35 by ZJTJZ
[基金申请] 帮忙看看fileCode +7 wwncly 2026-08-10 13/650 2026-08-11 19:36 by 冰心玉壶晴
[基金申请] 确定了,国自然21号放榜 +6 布布和一二 2026-08-10 7/350 2026-08-10 19:15 by 2000zf36392
信息提示
请填处理意见