| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2140 人关注过本帖
标题:如何使用随机数生成一组互不相等的数
只看楼主 加入收藏
st3624
Rank: 1
等 级:新手上路
帖 子:27
专家分:3
注 册:2015-11-18
结帖率:0
收藏
 问题点数:0 回复次数:11 
如何使用随机数生成一组互不相等的数
尝试了很久都没成功,以下是我现在编的,也不知道哪里错了
int main(void){
    int i, j, k, l, m, a[4][4], b[8] = {0};
srand(time(NULL));
for (k = 0; k < 8; k++){
        
        b[k] = rand() % 9 + 1;
        printf("%1d ", b[k]);
        int jihao = 1;
        while (jihao==1){
            for (l = 0; l < k; l++)
            {
                if (b[k] == b[l])
                    break;
            }
            if (l < k){
                b[k] = rand() % 9 + 1;
        }
            if (l == k)
                jihao = 0;
    }
        
        
            
}

}
2015-11-18 13:30
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9032
专家分:54061
注 册:2011-1-18
收藏
得分:0 
排版一下,并且少用点儿变量
你的问题在于 printf("%1d ", b[k]); 这一句放置的问题不对,放到后面去
2015-11-18 13:39
st3624
Rank: 1
等 级:新手上路
帖 子:27
专家分:3
注 册:2015-11-18
收藏
得分:0 
回复 2楼 rjsp
多谢指导。我把printf("%1d ", b[k]);放到后面去之后果然可以了,那么也就是说我之前只是print的位置弄错了,事实上这个数组已经被随机排列了咯
2015-11-18 14:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9032
专家分:54061
注 册:2011-1-18
收藏
得分:0 
回复 3楼 st3624
是的,但算法太烂

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>

void my_random_shuffle( unsigned* p, size_t n )
{
    if( n == 0 ) return;
    assert( n-1 <= RAND_MAX ); // 此时需要多个rand()相乘来产生更大的随机数

    for( size_t i=1; i!=n; ++i )
    {
        size_t r = rand()%(i+1);

        unsigned t = p[i];
        p[i] = p[r];
        p[r] = t;
    }
}

int main( void )
{
    unsigned a[] = { 1,2,3,4,5,6,7,8 };
    const size_t n = sizeof(a)/sizeof(a[0]);

    srand( (unsigned)time(NULL) );
    my_random_shuffle( a, n );
    for( size_t i=0; i!=n; ++i )
        printf( "%u ", a[i] );

    return 0;
}

2015-11-18 14:36
st3624
Rank: 1
等 级:新手上路
帖 子:27
专家分:3
注 册:2015-11-18
收藏
得分:0 
回复 4楼 rjsp
学到了,你这个编程里用的好多我都没学过,不过我现在知道他们的意思了。我接下来的目标是把这个随机一阶数组(8个数)放到一个4*4的二阶数组中(每个数字重复两次),让后再把这个二阶数组随机排列。
我编了以下程序,感觉逻辑没有错,但是就是print不出来(各种位置都试了)
int main(void){
    int i, j, k, l, m=0, a[4][4], b[8] = {0};
    srand(time(NULL));
    for (k = 0; k < 8; k++)
    {
        
        b[k] = rand() % 30 + 1;
        
        int jihao = 1;
        while (jihao==1){
            for (l = 0; l < k; l++)
            {
                if (b[k] == b[l])
                    break;
            }
            if (l < k)
            {
                b[k] = rand() % 9 + 1;
        }
            if (l == k)
                jihao = 0;
    }
        printf("%d ", b[k]);
        
            
}
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            a[i][j] = b[m];(我发现这里有错误,b最多8个,但是这里都到b【16】了,正在想办法解决)
            printf("%d ", a[i][j]);
        }   
        m = m + 4;
        
    }
   
   



}

[此贴子已经被作者于2015-11-18 15:02编辑过]

2015-11-18 14:56
XUMINGHUA
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-11-18
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{  int  k, l, b[8] = {0};
   srand(time(NULL));
   for(k=0;k<8;k++)
   {    b[k]=rand()%9+1;
        printf("%1d",b[k]);
       int jihao=1;
       while(jihao==1)
       {  for(l=0;l<k;l++)
       {  if (b[k] == b[l])
            break;}
          if(l<k)
          {   b[k]=rand()%9+1;
         }
        if(l==k)
       jihao=0;
        printf("\n");
       }            
 }

 }
差不多就这样
2015-11-18 15:57
st3624
Rank: 1
等 级:新手上路
帖 子:27
专家分:3
注 册:2015-11-18
收藏
得分:0 
回复 6楼 XUMINGHUA
我在main函数外得到了一个二维数组,怎么样才能把这个数组发送到main函数里使用呢
2015-11-18 16:09
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用st3624在2015-11-18 16:09:49的发言:

我在main函数外得到了一个二维数组,怎么样才能把这个数组发送到main函数里使用呢



这句话是有问题的  估计一般人都看不懂

猜测是   函数之间传递数组所在的内存块估计是无法实现的  只能通过指针来回传递数据

DO IT YOURSELF !
2015-11-18 16:17
st3624
Rank: 1
等 级:新手上路
帖 子:27
专家分:3
注 册:2015-11-18
收藏
得分:0 
回复 8楼 wp231957
其实我想问main函数外面不是还定义了一个函数g吗,然后main函数引用了这个函数g,这个函数g里面我又得到了一个数组,我想把函数g里面的数组通过一定方法让他在main函数里面有个一莫一样的数组,通过指针怎么实现呢,最笨的办法就是一个个发过去吗
2015-11-18 16:24
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用st3624在2015-11-18 16:24:28的发言:

其实我想问main函数外面不是还定义了一个函数g吗,然后main函数引用了这个函数g,这个函数g里面我又得到了一个数组,我想把函数g里面的数组通过一定方法让他在main函数里面有个一莫一样的数组,通过指针怎么实现呢,最笨的办法就是一个个发过去吗



你的这些发言 我是一点不懂啊  不知道你笨还是我笨

给你一段演示代码吧   
程序代码:
#include<stdio.h>

void test(int * s,int len)
{
    int begin=0;
    int end=len-1;
    for(;begin<=end;begin++,end--)
    {
        int tmp=*(s+begin);
        *(s+begin)=*(s+end);
        *(s+end)=tmp;
    }
}

int main()
{
    int k[6]={1,2,3,4,5,6};
    test(k,6);
    for(int i=0;i<6;i++) printf("%3d",k[i]);
    printf("\nnext continue......\n");
    return 0;
}



[此贴子已经被作者于2015-11-18 16:42编辑过]


DO IT YOURSELF !
2015-11-18 16:39
快速回复:如何使用随机数生成一组互不相等的数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018873 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved