24小时热门版块排行榜    

查看: 1257  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见