【问题标题】:'rand()' gives weird numbers [closed]'rand()' 给出了奇怪的数字 [关闭]
【发布时间】:2022-01-02 10:52:33
【问题描述】:

我正在尝试编写一个 void 函数,该函数在两个参数之间接受 50 个随机数并分配给一个数组以进行作业。输出给了我一堆 0 和奇怪的数字,比如 4254585 或 11277136,我该如何解决这个问题。

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

using namespace std;

void rndnums(int max ,int min, int arr[50])
{
    int rnd;

    srand(time(NULL));

    for(int i=0; i<50; i++)
    {
        rnd = rand() % max + min;
        arr[i] = rnd;
    }
}

int main()
{
    int arr[50];
    rndnums(30, 10, &arr[50]);

    for(int i=0; i < 50; i++)
        cout << i + 1 << ". = " << arr[i] << endl;
}

【问题讨论】:

  • 这是未定义的行为&amp;arr[50]
  • 试试rndnums(30, 10, arr);,尽量不要猜测语法。
  • 另外,srand(time(NULL)); 只能在 main() 中调用一次。
  • rnd = rand() % max + min; 这个公式是错误的:只考虑min=1000max=1001 的情况:这个表达式产生的最大值是min + (max-1) = 2000 &gt; 1001 = max。您需要改用rnd = rand() % (max - min + 1) + min;(假设两个边界都包含在所需范围内)
  • C++ 通过标准库提供了比 C 更多的功能;恕我直言,最好使用此功能:en.cppreference.com/w/cpp/numeric/random

标签: c++ random


【解决方案1】:

在函数的声明中,int arr[50] 表示“指向数组第一个元素的指针”。编译器会忽略 50(出于历史原因)。

在调用函数时,您应该只提供:rndnums(30, 10, &amp;arr[0])

此外,C++ 有一个专用的语法,继承自 C:rndnums(30, 10, arr)。为什么它的工作原理解释起来有点复杂,但它的设计正是考虑到这个用例 - 将指针和数组大小发送给填充数组的函数。

【讨论】:

  • 将函数签名更改为void rndnums(int max, int min, int (&amp;arr)[50]) 可能会更好,这将阻止使用rndnums(30, 10, &amp;arr[0]),这会更好。请注意,随机数的生成方式仍然存在错误...
  • 是的,这样会更好。但似乎代码是“C-like C++”,这需要一个指针而不是引用,并且可能对语言有更深入的理解。如果你有这样的理解,就用C++标准库(std::vectorstd::array)。
  • "Why it works is a little complicated to explain" -- What is array to pointer decay?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多