C 在“中生成给定范围内的随机数数组”;";

C 在“中生成给定范围内的随机数数组”;";,c,C,我想生成一个随机数数组,例如,如果范围是[0,10],那么所需的输出是 2356478901(非重复性) 我在使用rand()函数时遇到的问题是,有时我会得到一些重复的no,在该范围内离散值,每次调用时顺序都不同 附言:我确实读过一些文章 在这里和不能精细一个类似的矿井,有一个微妙的区别。特别是后一个非常接近如果您从一个整数为0-9(或任意范围)的数组开始,然后随机洗牌,您将有一个更轻松的时间。这里有一个示例说明了如何进行洗牌。您基本上希望将数组[0,1,…,9]随机化。这里是一个C++例子,应

我想生成一个随机数数组,例如,如果范围是[0,10],那么所需的输出是 2356478901(非重复性)

我在使用rand()函数时遇到的问题是,有时我会得到一些重复的no,在该范围内离散值,每次调用时顺序都不同

附言:我确实读过一些文章
在这里和不能精细一个类似的矿井,有一个微妙的区别。特别是后一个非常接近

如果您从一个整数为0-9(或任意范围)的数组开始,然后随机洗牌,您将有一个更轻松的时间。这里有一个示例说明了如何进行洗牌。

您基本上希望将数组[0,1,…,9]随机化。这里是一个C++例子,应该很容易转换成c:< /p>

似乎更像是随机分组的问题

Fisher-Yates shuffle是一个好的开始,它从元素的排序数组开始,并生成一个随机排列:

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;
}
int size=10;
int*元素=malloc(sizeof(int)*大小);
//日化
对于(int i=0;i0;--i){
//生成随机索引
int w=rand()%i;
//交换项目
int t=元素[i];
元素[i]=元素[w];
元素[w]=t;
}
+将所有数字放入结果数组
+从N降到2
+----洗牌N个元素
+返回数组

范例

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


编辑---谢谢!我甚至没有意识到我在上面做了太多的工作

  • 将所有数字放入结果数组中
  • 从N降到2
  • ----将元素N与从1到N的随机元素交换
  • 返回数组

    • 此代码仅适用于整数,但我希望它足够了。我使用GCC进行编译,并且只使用C标准库。阅读评论了解详情。您的结果将具有不同的值,但因为它是随机的

      #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;
      }
      

      测试环境

          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]
      
      $ 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.
      

      您的示例包含重复的“4”。按照GWW的回答:创建所需的范围并洗牌。如果你想要一个子组,你总是可以有一个较长的列表,并获取前N个元素。看这是家庭作业吗?首先,这不是家庭作业的问题,事实上这是我的一项实验室工作,我的教授告诉我一种完全不同的方式,我觉得这是一条漫长的道路,软件!3XOR交换在这里不是合适的方法,因为在i==w的情况下,它将清除第i个元素,而不是什么都不做。这里也不需要下限,因为%已经是整数。是的,已经修复了随机问题。没有注意到交换选项,谢谢:)现在你让我想了想,只想知道:有没有重置投票的方法?第二次单击upvote可重置upvote。现在我+1你的错误更正。Mhhh,否决了其他人。异或问题是一个微妙的事情,在调用时,洗牌算法生成相同的nos。。多次。@Rahul:请阅读rand()。它每次都会生成相同的序列。您需要使用真正的随机数(如时间)为PRNG设定种子,以获得不同的结果。@Vovanium:
      time
      不返回“真正的随机数”:-@pmg:我的意思不是确定性伪随机数。从程序的角度来看,它确实是随机的。我想让你得到最真实的随机,只有量子源可以给你一个