Generating unique random numbers except from a spe

2019-07-14 04:52发布

This question already has an answer here:

I was wondering, how can I generate unique random numbers except from a specific one. For example, if I want to generate numbers in range 1 to 10 except from 3, the output should be something like this:

7 6 1 2 4 9 5 8 10

标签: c random
6条回答
混吃等死
2楼-- · 2019-07-14 05:32

Shuffle the numbers 1 - 10 and remove 3.

It doesn't matter if you remove the 3 before or after shuffling.

Alternatively, shuffle the numbers 1 - 9 and relabel 3 as 10...

For shuffling without bias you can use for example the Fisher-Yates algorithm. http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

查看更多
别忘想泡老子
3楼-- · 2019-07-14 05:32

This is my answer - returns random value in [min, max), except "except".

int myrand(int min, int max, int except) {
   int rc;
   do {
      rc = min + rand() % (max - min); 
   } while(rc == except);
   return rc;
}
查看更多
太酷不给撩
4楼-- · 2019-07-14 05:34

This code will generate unique random numbers from minimum to maximum of a given range.

#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;
}
查看更多
Deceive 欺骗
5楼-- · 2019-07-14 05:38

Generate random number in the range 1..9 and add one if the number is greater than or equal to 3.

查看更多
成全新的幸福
6楼-- · 2019-07-14 05:46

You may try like this:-

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

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

then later you can do this:-

 x = randomnumber(1,10);

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

or

if (x!=3)
{ printf("%d",x)}
查看更多
贼婆χ
7楼-- · 2019-07-14 05:50

Generate a number. Check its value, if the number is 3 generate another one. If it isn't 3 then use it.

EDIT: Thinking before coffee is a terrible plan. If you want to get every number in the range in a random order then I agree with the others talking about shuffling lists. If however you want some random subset of the range I would store a list of forbidden values. Shuffling and only taking the first n numbers would also be suitable if the range isn't very large (e.g. not something like 0<x<INT_MAX).

Every time you generate a number check if the generated number is on the forbidden list and if it is, generate another number. Every time you generate a valid number you add it to the list to ensure generated numbers are unique. The list should also be initialised with your unwanted numbers (3 in the example given).

查看更多
登录 后发表回答