24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 1319  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 327求调剂 +4 拾光任染 2026-04-05 4/200 2026-04-05 20:16 by 南航~万老师
[考研] 322求调剂 +3 嗯哼哼恒 2026-04-05 3/150 2026-04-05 19:52 by nepu_uu
[考研] 一志愿南昌大学,085600,344分求调剂 +4 调剂上岸玘 2026-04-05 4/200 2026-04-05 18:31 by imissbao
[考研] 085500机械专硕初试288求调剂 +3 GZJguo666- 2026-04-05 3/150 2026-04-05 18:06 by jkddd
[考研] 0703总分331求调剂 +10 ZY-05 2026-04-04 13/650 2026-04-05 11:03 by xiayan13521
[考研] 320分人工智能调剂 +7 振—TZ 2026-04-03 7/350 2026-04-05 00:42 by chongya
[考研] 363求调剂 +7 zh096 2026-04-04 7/350 2026-04-04 17:13 by dongzh2009
[考研] 085600,320分求调剂 +14 大馋小子 2026-04-04 15/750 2026-04-04 16:27 by 无际的草原
[考研] 一志愿085404,总分291,四级已过,求调剂 +5 阿俊阿俊阿俊 2026-04-04 7/350 2026-04-04 13:23 by 莲菜就是藕吧
[考研] 266求调剂 +8 学员97LZgn 2026-04-03 8/400 2026-04-04 09:02 by 20021109
[考研] 求调剂 +3 wos666 2026-04-03 3/150 2026-04-04 05:16 by gswylq
[考研] 293求调剂 +5 末未mm 2026-04-02 6/300 2026-04-03 15:20 by 王保杰33
[考研] 302求调剂 +9 zyx上岸! 2026-04-02 9/450 2026-04-02 23:07 by 马儿快快地跑
[考研] 一志愿北京科技材料科学与工程288分,求调剂 +14 是辰啊 2026-04-02 14/700 2026-04-02 21:10 by dongzh2009
[考研] 085602化工求调剂(331分) +9 111@127 2026-03-30 9/450 2026-04-02 20:00 by dick_runner
[考研] 初试301,代码085701环境工程,本硕一致,四六级已过,有二区一作,共发表5篇论文 +6 axibli 2026-04-01 6/300 2026-04-02 13:42 by Ecowxq666!
[考研] 261求B区调剂 +5 明仔· 2026-04-01 7/350 2026-04-02 11:17 by 邹尉尉
[考研] 【求调剂】新能源材料本科,一志愿211,初试321 +6 求调剂学校, 2026-04-02 6/300 2026-04-02 09:41 by 晴空210210
[考研] 298求调剂 +4 什么是胖头鱼 2026-03-30 6/300 2026-04-01 22:06 by 客尔美德
[考研] 284求调剂 +12 小熊~~ 2026-03-31 12/600 2026-04-01 20:23 by 花??
信息提示
请填处理意见