首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Xcode编译的代码给出了一个不正确的(?)输入与具有相同输入的其他几个编译器的比较

用Xcode编译的代码给出了一个不正确的(?)输入与具有相同输入的其他几个编译器的比较
EN

Stack Overflow用户
提问于 2019-02-05 06:25:26
回答 1查看 54关注 0票数 0

来自Xcode (不正确)和其他(基于web的编译器)的测试输入和输出如下:

输入1: 3 30 0.90 40

Xcode输出1:可接受的成功率: 0.90

平均销售额: 30.00

平均完成销售额: 19.33

观察成功率: 0.64

观察成功率在可接受范围内。

以退出代码结束的程序:0

其他编译器的输出1(正确):可接受的成功率: 0.90

平均销售额: 30.00

平均完成销售额: 19.67

观察成功率: 0.66

观察成功率在可接受范围内。

投入2: 10 100 0.5 1

Xcode输出2:可接受的成功率: 0.50

平均销售额: 100.00

平均完成销售额: 29.40

观察成功率: 0.29

观察成功率在可接受范围内。

以退出代码结束的程序:0

其他编译器的输出1(正确):可接受的成功率: 0.50

平均销售额: 100.00

平均完成销售额: 28.80

观察成功率: 0.29

观察成功率在可接受范围内。

代码语言:javascript
复制
#include <iostream>
#include  <iomanip>
#include <stdlib.h>
using namespace std;

int main()
{
    int iterations, seed;
    double successRate;

    float completedSales = 0, numAttempted;
    int  i, t;
    int seatChoice;

    //Add other variables necessary for your program

    //cout << "Please enter number of iterations to be evaluated" <<endl;
    cin >> iterations; //number of iterations to be evaluated

    //cout << "Please enter number of attempted sales" <<endl;
    cin >> numAttempted; //number of attempted sales

    //cout << "Please enter expected success rate" <<endl;
    cin >> successRate;

    //cout << "Please enter seed for random number generation" <<endl;
    cin >> seed; //seed for random number generation


    //Validate input
    if(iterations <= 0 || numAttempted < 0 || seed < 0 ) {
        cout << "Error. Invalid parameters.";

    }
    else if(successRate < 0 || successRate > 1) {
        cout << "Error. Invalid parameters.";
    }
    else {
        //Set seed and start iterations
        srand(seed);

        //Every iteration of the simulation starts by setting all seats to empty

        for(i = 0; i < iterations; ++i) {

            int availableSeats[30] = {0};

            for(t = 0; t < numAttempted; ++t) {
                seatChoice = (rand() % 30);

                if(availableSeats[seatChoice] == 0) {
                    availableSeats[seatChoice] = 1.0;
                    completedSales++;
                }
            }
        }
        float averageSales = (float) completedSales/iterations;
        float observedSuccessRate = (float) averageSales/numAttempted;

        //Complete final output:
        cout << setprecision(2) <<fixed;
        cout << "Acceptable success rate: "  <<successRate <<endl;
        cout << "Average attempted sales: " <<(double)numAttempted <<endl;
        cout << "Average completed sales: " <<averageSales <<endl;
        cout << "Observed success rate: " <<(float)observedSuccessRate <<endl;

        //Complete if statement to test success rate
        if(observedSuccessRate < successRate) {
            cout << "Observed success rate not in acceptable range." << endl;
        }
        else {
            cout << "Observed success rate is acceptable." << endl;
        }
    }
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2019-02-05 07:53:11

在重新阅读您的代码时,“不正确”的行为仅仅是相同种子的不同结果吗?这可能是由于srandrand在C++编译器(和标准库)之间的不同实现造成的。

Xcode使用Clang (默认为libc++ ),而其他编译器可能使用GCC,后者使用libstdc++。Microsoft编译器也有自己的实现。通常,不能依赖于这些实现是相等的。

您的选项是要么创建自己的伪随机数生成器(PRNG),要么使用内置的Mersenne扭转发电机 std::mt19937。这将在不同的平台上产生相同的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54528767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档