| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1976 人关注过本帖
标题:怎样才能得到不相同的n个随机数?
只看楼主 加入收藏
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
怎样才能得到不相同的n个随机数?
写了一个猜数字的程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "../project2/system.h"
void guess(int n)
{
    int a[20], b[20], i, j, countA, countB,k,flag;
p:srand((unsigned)time(0));
    do
    {
        flag = 0;
        for (i = 1; i < n + 1; i++)
            a[i] = rand() % 10;
        for (i = 1; i < n ; i++)   /*这个for加大括号和不加有什么区别?加了程序就运行不了!*/
        
            for (j = i + 1; j < n + 1; j++)
                if (a[i] == a[j]);        /*这是判断是否有重复数的程序,起不到效果还是有重复的*/
            {

                flag = 1;
                break;
            }
        
    } while (flag == 1);
   
    k = 0;
    printf("请输入%d个(0-9)以内不同的数,中间用空格格开\n", n);
    do
    {
        countA = 0;
        countB = 0;
        for (i = 1; i < n + 1; i++)
        {
            scanf_s("%d", &b[i]);
        }
        k++;
        for (i = 1; i < n + 1; i++)
        {
            if (a[i] ==b[i])
            {
                countA++;
            }
            for (j = 1; j < n + 1; j++)
            {
                if (a[i] == b[j] && i != j)
                    countB++;
            }
        }
        printf("数和位置都相同的有%d个,数相同位置不同的有%d个。\n你猜了总共%d。\n", countA, countB, k);
        for (i = 1; i < n + 1; i++)
        {
            printf("%d ", a[i]);   /*打印出随机数组,有时总有两个数是重复的*/
        }
        if(countA==n)
        {
            if (k == 1)
            {
                printf("\n    你是个超级幸运儿!\n");
            }
            else if (k > 1 && k <= 5)
            {
                printf("\n    你是个天才!\n");
            }
               
            else if (k > 5 && k <= 10)
            {
                printf("\n    你很聪明!\n");
            }
               
            else
            {
                printf("\n    你还须努力!\n");
            }
            goto p;
        }
    } while (1);
}
void main()
{
    int n;
    system("cls");
    gotoxy(15, 6);
    printf("开始猜数字游戏!\n");
    gotoxy(15, 10);
    printf("请输入猜数个数:");
    scanf_s("%d", &n);
    guess(n);
    system("pause");
}
打印出随机数组,有时总有两个数是重复的,
2016-07-05 15:22
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
头文件
#include <windows.h>
void gotoxy(int x, int y) //定位到第y行的第x列
{
    int xx = 0x0b;
    HANDLE hOutput;
    COORD loc;
    loc.X = x;
    loc.Y = y;
    hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOutput, loc);
    return;
}
2016-07-05 15:26
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
程序代码:
do
    {
        flag = 0;
        for (i = 1; i < n + 1; i++)
            a[i] = rand() % 10;
        for (i = 1; i < n; i++)   /*这个for加大括号和不加有什么区别?加了程序就运行不了!*/
        {
            for (j = i + 1; j < n + 1; j++)
            {
                if (a[i] == a[j])        /*多了个分号*/
                {

                    flag = 1;
                    break;
                }
            }
        }
    } while (flag == 1);
2016-07-05 15:34
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:10 
/*
    从 [n, m] 中随机取 k 个不重复的数
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

main()
{
    int n  = 1;
    int m  = 9;
    int k  = 5;
    int mn = m - n + 1;
    int *numarr = (int*)malloc(mn * sizeof(int));
    int *p = numarr;
    for (int i=n; i<=m; i++, p++)
    {
        *p = i;
    }
    srand((unsigned)time(0));
    p = numarr;
    for (int i=0,j=0; i<k; i++, mn--)
    {
        j = rand()%mn;
        printf("%d ", *(p+j));
        memmove((p+j), (p+j+1), (mn-j-1)*sizeof(int));
    }
    free(numarr);
}
2016-07-05 15:45
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
以下是引用grmmylbs在2016-7-5 15:34:00的发言:

do
    {
        flag = 0;
        for (i = 1; i < n + 1; i++)
            a = rand() % 10;
        for (i = 1; i < n; i++)   /*这个for加大括号和不加有什么区别?加了程序就运行不了!*/
        {
            for (j = i + 1; j < n + 1; j++)
            {
                if (a == a[j])        /*多了个分号*/
                {

                    flag = 1;
                    break;
                }
            }
        }
    } while (flag == 1);

正解
2016-07-05 16:29
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 4楼 吹水佬
不懂你的程序是干什么的。
2016-07-05 16:36
快速回复:怎样才能得到不相同的n个随机数?
数据加载中...
 
   



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

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