繁体   English   中英

生成唯一的随机数,除了C中的特定随机数[重复]

[英]Generating unique random numbers except from a specific one in C [duplicate]

这个问题在这里已有答案:

我想知道,除了特定的随机数之外,我怎么能生成独特的随机数。 例如,如果我想生成范围1 to 10 except from 3数字, 1 to 10 except from 3 ,输出应该是这样的:

7 6 1 2 4 9 5 8 10

将数字1 - 10随机移动并删除3。

如果你在改组之前或之后移除3并不重要。

或者,将数字1 - 9和重新标记3重新排列为10 ...

对于没有偏差的改组,您可以使用例如Fisher-Yates算法。 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

生成1..9范围内的随机数,如果数字大于或等于3,则加1。

生成一个数字。 检查其值,如果数字为3则生成另一个值。 如果不是3则使用它。

编辑:咖啡之前的思考是一个可怕的计划。 如果你想以随机顺序得到范围内的每个数字,那么我同意其他人谈论改组列表。 但是,如果你想要一些范围的随机子集,我会存储一个禁止值列表。 如果范围不是很大(例如,不是0 <x <INT_MAX),那么改组并且仅取前n个数也是合适的。

每次生成一个数字时,检查生成的数字是否在禁止列表中,如果是,则生成另一个数字。 每次生成有效数字时,都会将其添加到列表中,以确保生成的数字是唯一的。 该列表也应该使用您不需要的数字进行初始化(给出的示例中为3)。

此代码将生成从给定范围的最小值到最大值的唯一随机数。

#include<stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>

int main()
{

    int max_range, min_range, i = 0, rand_num;

    srand((unsigned)time(NULL));
    printf("Enter your maximum of range: ");
    scanf("%d", &max_range);
    printf("Enter your minimum of range: ");
    scanf("%d", &min_range);
    bool digit_seen[max_range + 1]; // VLAs For C99 only 

    for (int i = min_range; i <= max_range; i++)
        digit_seen[i] = false;  

    for (;;)
    {  
         rand_num = rand() % max_range + min_range;
         if(rand_num !=3)
             if(!digit_seen[rand_num])
             {
                printf("%d ", rand_num);
                digit_seen[rand_num] = true;
                i++;
             }
         if( i == (max_range - 1) )
             exit(0);
    }    
    return 0;
}

你可以尝试这样: -

unsigned int
randomnumber(unsigned int min, unsigned int max)
{
       double scaled = (double)rand()/RAND_MAX;

       return (max - min +1)*scaled + min;
}

然后你可以这样做: -

 x = randomnumber(1,10);

if (x==3)
{ x = x+1;}

要么

if (x!=3)
{ printf("%d",x)}

这是我的答案 - 在[min,max]中返回随机值,“except”除外。

int myrand(int min, int max, int except) {
   int rc;
   do {
      rc = min + rand() % (max - min); 
   } while(rc == except);
   return rc;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM