C语言中的随机数和不同数

C语言中的随机数和不同数,c,random,srand,C,Random,Srand,我正在尝试用C生成7个数字。代码应包含: 它不能以0开头 数字必须介于0-9之间 数字必须彼此不同。(例如:不能有两个5s,像这个:7583254) 我的代码正在运行。它不是以0开头的。数字在0-9之间随机生成 但我不能把第三件事包括进去。当我启动代码时,同样的数字也会出现。你知道我怎样才能产生完全不同的结果吗 #包括 #包括 #包括 #包括 #包括 int main(){ srand(时间(空)); 整数[10]; int i; 对于(i=0;i

我正在尝试用C生成7个数字。代码应包含:

  • 它不能以0开头
  • 数字必须介于0-9之间
  • 数字必须彼此不同。(例如:不能有两个5s,像这个:7583254)
我的代码正在运行。它不是以0开头的。数字在0-9之间随机生成

但我不能把第三件事包括进去。当我启动代码时,同样的数字也会出现。你知道我怎样才能产生完全不同的结果吗

#包括
#包括
#包括
#包括
#包括
int main(){
srand(时间(空));
整数[10];
int i;
对于(i=0;i<7;i++){
数字[i]=rand()%10;
如果(数字[0]==0){
数字[0]=1+rand()%9;
}
printf(“%d”,数字[i]);
}  
getch();
返回0;
}

我是一个初学者,所以我的解决方案可能不是最好的,但您可以使用memchr函数搜索您在选项卡中已经填写的内容,它可能类似于:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h> 
#include <locale.h>
#include <time.h>
#include <string.h>
int main()
{

    srand(time(NULL));
    int numbers[10];
    int i;
    for (i = 0; i < 7; i++) {
        numbers[i] = rand() % 10;

        if(numbers[0] == 0){
            numbers[0] = 1 + rand()%9;
        }

        else if (memchr(tab, tab[i], i)){
            numbers[i] = rand() % 10;
        }

        printf(" %d ", numbers[i]);
   }

   getch();
   return 0;
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
srand(时间(空));
整数[10];
int i;
对于(i=0;i<7;i++){
数字[i]=rand()%10;
如果(数字[0]==0){
数字[0]=1+rand()%9;
}
else if(memchr(tab,tab[i],i)){
数字[i]=rand()%10;
}
printf(“%d”,数字[i]);
}
getch();
返回0;
}

编辑:无论如何,同时阅读你问题下方的评论,你可能会更喜欢另一种更优化的解决方案,因为我的解决方案很差劲,你进入标签越多,生成有效数字的机会就越小,使用排列()

#包括
#包括
#包括
#包括
静态整数区域(整数范围)
{
返回值(int)((双)范围*(rand()/(rand_MAX+1.0));
}
静态无效随机化(int arr[],int size)
{
而(大小>1)
{
int item=rrand(大小--);
内部温度=arr[尺寸];
arr[尺寸]=arr[项目];
arr[项目]=温度;
}
}
内部主(空)
{
int arr[]={0,1,2,3,4,5,6,7,8,9};
int size=sizeof arr/sizeof*arr;
srand((无符号)时间(NULL));
while(arr[0]==0)
{
随机化(arr、大小);
}
对于(int i=0;i<7;i++)
{
printf(“%d\n”,arr[i]);
}
}

如果所有数字都应该是不同的,(1)用序列1-10填充数组。(2) 顺序。结果将是您想要的随机唯一序列。我同意@WhozCraig建议的解决方案,然后如果数字以0开头,则将0与其他6个数字中的随机数字交换。我必须在不使用洗牌的情况下执行此操作。我忘了提了。嗯,这很可爱,而且在教练方面也很愚蠢。结果是基于随机的O(N^2)与具体的O(N)算法,完全没有必要。向教马拉基的天才致敬。@WhozCraig我没有什么要补充的。这似乎是一个比我发布的更有效的解决方案:)无论如何,除了打印的第一个数字,它应该在范围内包括0(可以很容易地固定)OP练习:从零开始序列,而不是从一开始,如果它在洗牌后回到插槽0中,则将其交换为不包括插槽0的随机拾取。(显然允许为零,但不在第一个插槽中)。使用fp div消除模偏差的道具。哦,谢谢,我没有注意这个要求:(对于像这样的一个小集合,修复的不是那么糟糕,但是你应该注意(正如@WhozCraig所评论的)模偏差,看看:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>

static int rrand(int range)
{
    return (int)((double)range * (rand() / (RAND_MAX + 1.0)));
}

static void randomize(int arr[], int size)
{
    while (size > 1)
    {
        int item = rrand(size--);
        int temp = arr[size];

        arr[size] = arr[item];
        arr[item] = temp;
    }
}

int main(void)
{
    int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int size = sizeof arr / sizeof *arr;

    srand((unsigned)time(NULL));
    while (arr[0] == 0)
    {
        randomize(arr, size);
    }
    for (int i = 0; i < 7; i++)
    {
        printf("%d\n", arr[i]);
    }
}