【问题标题】:how to create an array of random number, all different from each other?如何创建一个随机数数组,彼此不同?
【发布时间】:2021-01-31 09:37:26
【问题描述】:

程序应该只打印出数组的元素,该数组存储 10 到 30 之间的随机整数。我希望这些数字彼此不同,但我的程序不工作,有什么问题吗?谢谢 代码:

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

int main()
{
    const int N=12;
    int arr[N],i,j;
    srand(time(0));
    for(i=0; i<N; i++)
        arr[i]=10+rand()%20;

    for(i=0; i<N; i++)
    {
        for(j=N-1; j == 0; j--)
        {
            do
            {
                arr[i]=10+rand()%20;
                if(arr[i]!=arr[j])
                    break;
            }
            while(arr[i]==arr[j]);
        }
        printf(">>%d\n",arr[i]);
    }

    return 0;
}

【问题讨论】:

  • 你是怎么用轮盘赌(给随机数)、铅笔和纸的?您如何(在纸上)检测到 12 个数字都不同?
  • @basile-starynkevitch 我不知道我每次都尝试将这个数字与其他所有数字进行比较,但显然不起作用
  • 您首先需要能够自己用铅笔和纸来完成这项工作。如果不能,您将无法对计算机进行编程!

标签: arrays c random


【解决方案1】:

数字需要彼此不同这一事实意味着它们并不是真正随机的。您可以创建另一组数字,其中包含元素 10 到 30。随机化该列表并将它们拉入您的数组。

【讨论】:

  • 好吧,但我的程序仍然无法检测到等于数字,主要问题是那个
  • 如果你把唯一的数字放入初始列表:[10, 11, 12, ... 29, 30] 然后随机排序,前十个数字必须是唯一的。
【解决方案2】:

C++ 版本:

const int begin = 10;
const int end = 30;
// creates a vector of 30-10 zeroes
std::vector<int> v(begin-end);
// fill vector with 10, 11, ..., 30.
std::iota (std::begin(v), std::end(v), begin); 
// a source for random seed
std::random_device rd;
// seed this generator with 32-bit number
std::mt19937 g(rd());
// randomly shuffle a vector
std::shuffle(std::begin(v), std::end(v), g);

const int N = 12;
std::vector<int> result(v.begin(), v.begin() + N);

C 版:

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

// https://stackoverflow.com/a/6127606/1953079
void shuffle(int *array, size_t n)
{
    if (n <= 1) { return; }
    
    size_t i;
    for (i = 0; i < n - 1; i++) 
    {
        size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
        int t = array[j];
        array[j] = array[i];
        array[i] = t;
    }
}

int main(){
    const int begin = 10;
    const int end = 30;
    const int N = 12;
    srand(time(0));

    // array that contains elements 10, 11...30
    int nums[end-begin];
    for(int i=0;i<end-begin; i++){
        nums[i] = begin+i;
    }

    // randomly shuffle array
    shuffle(nums, end-begin);

    // take first N elements
    int result[N];
    for(int i=0;i<N;i++){
        result[i] = nums[i];
        printf("%d ", result[i]);
    }
}

【讨论】:

  • 对不起,我在想一些更简单的代码,这看起来有点高级,我不明白
  • 简单来说就是需要生成一个唯一元素10、11...30的排序数组,然后随机打乱数组元素(std::shuffle,或者你可以找到它的实现并重新开始) ,然后取前 N 个元素。这正是这段代码的作用。
  • 你不应该写rand() % (RAND_MAX / (n - i) + 1)吗?
【解决方案3】:

感谢您的帮助,但经过更多查找后,我发现我做错了什么,现在可以工作了。 代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
const int N=12;
int arr[N],i,j;
srand(time(0));
for(i=0;i<N;i++)
{
    arr[i]=10+rand()%30;
}
for(i=0;i<N;i++)
{
    for(j=i+1;j<N;j++)
    {
        
        if(arr[i]==arr[j])
        {
            do
            {
                arr[i]=10+rand()%30;
            }
            while(arr[i]==arr[j]);
        }
    }
    printf(">>%d\t",arr[i]);
}
 return 0;
}

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2017-07-06
    • 2020-10-21
    • 2018-02-20
    • 2016-04-12
    • 1970-01-01
    相关资源
    最近更新 更多