【问题标题】:Issue with C++ Srand ValuesC++ Srand 值问题
【发布时间】:2014-12-28 23:13:54
【问题描述】:

所以我正在创建一张带有随机值的彩票,然后对其进行排序。我不担心排序技术,因为老师没有在这个作业中寻找课程等,它有效,但是,我产生的票值 - 尽管使用了 srand (time(0)) ,然后是 rand () % 40 + 1 - 我认为这应该使我的随机数在 1-40 之间...但 mainTicket[0] 始终等于 0。有什么想法吗?对格式感到抱歉,让我添加了额外的空格并弄乱了我的缩进。

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

using namespace std;

void mainLotto (int main[]);
void lottoSort (int ticketArr[]);

int main()
{
int mainTicket[5];

srand (time(0));

mainLotto(mainTicket);

do
{
    lottoSort(mainTicket);
} while (mainTicket[0] > mainTicket[1] || mainTicket[1] > mainTicket[2] || mainTicket[2] > mainTicket[3] || mainTicket[3] > mainTicket[4] || mainTicket[4] > mainTicket[5]);

for (int i = 0; i < 5; i++)
{
    cout << mainTicket[i] << "\n\n";
}

return 0;
}

///
/// <> Creates the actual lottery ticket
///
void mainLotto (int main[])
{
// Creating the ticket
for (int i = 0; i < 5; i++)
{
    main[i] = rand() % 40 + 1;
}
}

///
/// <> Sorts the actual lottery ticket
///
void lottoSort (int ticketArr[])
{
 // Sorting the ticket
for (int j = 0; j < 5; j++)
{
    if (ticketArr[j] > ticketArr[j+1])
    {
        int temp;

        temp = ticketArr[j+1];

        ticketArr[j+1] = ticketArr[j];

        ticketArr[j] = temp;
    }
}
}

【问题讨论】:

  • ticketArr[j+1] 越界
  • 只是一个提示供进一步考虑:尝试将自己的行长度限制在 80 左右,尤其是在您在线发布的代码上。让读者水平滚动真的很糟糕。此外,始终如一地应用适当的缩进(选择一种常见的样式,如 K&R)确实很有帮助,不仅在这里,而且对您自己也是如此。
  • 我确实使用了一种恒定的缩进形式,但我不缩进第一件事,这是我在这里编码时必须做的。不过,我可能会在这里开始做它以备将来使用,谢谢您的提示!

标签: c++ random time srand


【解决方案1】:

我刚刚在mainLotto() 之后打印了您声称始终为零的项目,结果为 30。

我怀疑问题出在你告诉我们不要看的地方。 :)

在你做的排序功能中:

for (int j = 0; j < 5; j++) {
    if (ticketArr[j] > ticketArr[j + 1]) {

数组的大小为 5。您的 j 最终将采用等于 4 的值。

然后你做ticketArr[j + 1],这实际上是一个越界访问。

解决方法是在循环中一直到 4,而不是 5。

正如 Galik 所说,mainTicket[4] &gt; mainTicket[5] 也是越界访问,阅读我的回答后,您应该能够理解原因。 :)

【讨论】:

  • 啊,我完全错过了!关于如何重写它以确保我永远不会越界的任何建议?尝试 j 和 j-1 的组合,但我没有取得太大的成功。
  • 您的循环应该持续到 4,而不是 5。@ldehart
【解决方案2】:

我发现您的数组被越界访问有两个问题:

这里:

int main()
{
    int mainTicket[5];

    srand(time(0));

    mainLotto(mainTicket);

    do
    {
        lottoSort(mainTicket);
    }
    while(mainTicket[0] > mainTicket[1] || mainTicket[1] > mainTicket[2]
        || mainTicket[2] > mainTicket[3] || mainTicket[3] > mainTicket[4]);
//      || mainTicket[4] > mainTicket[5]); // OUT OF BOUNDS!!!

    for(int i = 0; i < 5; i++)
    {
        cout << mainTicket[i] << "\n\n";
    }

    return 0;
}

这里:

void lottoSort(int ticketArr[])
{
    // Sorting the ticket
    for(int j = 0; j < 4; j++) // j < 4 NOT 5!!! <== WAS OUT OF BOUNDS
    {
        if(ticketArr[j] > ticketArr[j + 1])
        {
            int temp;

            temp = ticketArr[j + 1];

            ticketArr[j + 1] = ticketArr[j];

            ticketArr[j] = temp;
        }
    }
}

很可能排序例程从数组边界外拖入一个零。

【讨论】:

  • 哇,我也错过了条件语句......它现在就像一个魅力,谢谢大家!
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
相关资源
最近更新 更多