To generate array of random numbers in a given range in “C”

后端 未结 5 962
心在旅途
心在旅途 2020-12-20 08:23

i want to generate an array of random numbers for example if the range is [0,10] then the desired output to be 2 3 5 6 4 7 8 9 0 1 ( non repeatitive )

the problem

相关标签:
5条回答
  • 2020-12-20 09:09

    + Put all your numbers in the result array
    + from N down to 2
    + ---- shuffle N elements
    + return array

    Example

    fillarray(arr, 10);
    for (n = 10; n > 1; n++) shufflearray(arr, n);
    /* done */
    


    Edit --- thanks downvoter! I didn't even realize I was doing too much work up there

    • Put all your numbers in the result array
    • from N down to 2
    • ---- swap element N with a random element from 1 to N
    • return array
    0 讨论(0)
  • 2020-12-20 09:13

    It seems more a problem of shuffling that of randomization.

    A good start is the Fisher-Yates shuffle which starts with the sorted array of elements and generate a random permutation:

    int size = 10;
    int *elements = malloc(sizeof(int)*size);
    
    // inizialize
    for (int i = 0; i < size; ++i)
      elements[i] = i;
    
    for (int i = size - 1; i > 0; --i) {
      // generate random index
      int w = rand()%i;
      // swap items
      int t = elements[i];
      elements[i] = elements[w];
      elements[w] = t;
    }
    
    0 讨论(0)
  • 2020-12-20 09:17

    You will have an easier time if you start out with an array with the integers 0-9 (or whatever your range is) and then randomly shuffle it. There's an example of how to do the shuffling here.

    0 讨论(0)
  • You would basically want to randomize an array [0, 1, ..., 9]. Here's a C++ example, should be easy to transform to C:

    • http://www.fredosaurus.com/notes-cpp/misc/random-shuffle.html
    0 讨论(0)
  • 2020-12-20 09:22

    This code only for integer numbers, but I hope it will be enough. I am used the GCC for compilation and only the C standard library. Read comments for details. Your results will be has different values, but since it will be random.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <errno.h> // http://man7.org/linux/man-pages/man3/errno.3.html
    
    #define ERROR_MIN_MORE_MAX_VALUE "Min value is more max value, returned 0"
    
    
    /*
        Returns a random integer in between min (inclusive) and max (inclusive)
        Returns 0 if min > max and to write a error message.
     */
    static int
    random_integer(const int min, const int max) {
        if (max == min) return min;
        else if (min < max) return rand() % (max - min + 1) + min;
    
        // return 0 if min > max
        errno = EINVAL;
        perror(ERROR_MIN_MORE_MAX_VALUE);
        return 0;
    }
    
    
    /*
        Fills an array with random integer values in a range
     */
    static int
    random_int_array(int array[], const size_t length, const int min, const int max){
        for (int i = 0; i < length; ++i) {
            array[i] = random_integer(min, max);
        }
        return 0;
    }
    
    
    /*
        Print an array of integer items
     */
    void
    print_int_array(int array[], size_t length) {
        char ending_charapter[] = ", ";
        putchar('[');
        for (size_t i = 0; i < length; ++i) {
            printf("%d", array[i]);
            if (i < length - 1) {
                printf("%s", ending_charapter);
            }
        }
        puts("]");
    }
    
    
    int
    main (const int argc, const char *argv[])
    {
        // for get a random integer number from a system, to pass a current time to the function srand
        srand(time(NULL));
    
        int arr[10];
    
        printf("\tAn array with random values from 0 to 100\n");
        random_int_array(arr, 10, 0, 100);
        print_int_array(arr, 10);
    
        printf("\n\tAn array with random values from -100 to 0\n");
        random_int_array(arr, 10, -100, 0);
        print_int_array(arr, 10);
    
        printf("\n\tAn array with random values from -100 to 100\n");
        random_int_array(arr, 10, -100, 100);
        print_int_array(arr, 10);
    
        return 0;
    }
    

    Result

        An array with random values from 0 to 100
    [86, 25, 98, 61, 42, 26, 87, 56, 86, 79]
    
        An array with random values from -100 to 0
    [-33, -92, -57, -92, -6, -15, -61, -32, -75, -85]
    
        An array with random values from -100 to 100
    [-15, -99, 54, 42, -74, 46, 6, -44, 86, -47]
    

    Testing environment

    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Debian
    Description:    Debian GNU/Linux 8.6 (jessie)
    Release:    8.6
    Codename:   jessie
    $ uname -a
    Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
    $ gcc --version
    gcc (Debian 4.9.2-10) 4.9.2
    Copyright (C) 2014 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    0 讨论(0)
提交回复
热议问题