列表

详情


NC319. 用rand5()实现rand7()

描述

给定一个函数 rand5()可生成 [1,5] 范围内的均匀随机整数,请你试写一个方法 rand7 生成 [1,7] 范围内的均匀随机整数。
1.你只能调用 rand5() 且不能调用其他随机函数的方法。比如请不要使用系统的random() 方法,不要用题目里面类似于rand5的方法。
2.每个测试用例将有一个内部参数 n,表示你实现的函数 rand7() 在测试时将被调用的次数,但是这个参数不会被你看见,你可以在自测的时候使用。
3.该题判断你的代码是否正确的依据是:
3.1 你的代码不会陷入死循环,导致超时或者其他情况
3.2 你生成的数据是否都在[1,7]内
3.3 你生成的数据的期望是否接近4
3.4 你生成的数据在[1,7]是不是接近均匀分布

数据范围:

示例1

输入:

1

输出:

[2]

示例2

输入:

2

输出:

[1,5]

示例3

输入:

3

输出:

[1,3,7]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 12ms, 内存消耗: 920KB, 提交时间: 2022-03-09

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * srand((unsigned int)time(NULL)); already set
 * rand5() is defined
 *@return a random integer in the range 1 to 7
 *
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int rand5()
{
    return rand()%5+1;
}

int rand7() {
    // write code here
    int ret = 5 * rand5() + rand5() - 5;
    if(ret > 21)
        return rand7();
    return ret % 7 + 1;
}

C++ 解法, 执行用时: 13ms, 内存消耗: 908KB, 提交时间: 2022-05-03

#include <random>
std::random_device
rd;  // Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> distrib(1, 5);
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * rand5() is defined
     * @return a random integer in the range 1 to 7
     */
    int rand5() {
        return distrib(gen);
    }
    int rand7() {
        // write code here
        int x = (rand5() - 1) * 5 + rand5() - 1;
        while (x > 20) {
            x = (rand5() - 1) * 5 + rand5() - 1;
        }
        return x % 7 + 1;
    }
};

C++ 解法, 执行用时: 14ms, 内存消耗: 928KB, 提交时间: 2022-03-07

#include <random>
std::random_device rd;  // Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> distrib(1, 5);
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * rand5() is defined
     * @return a random integer in the range 1 to 7
     */
    int rand5(){
        return distrib(gen);
    }
    int rand7() {
        // write code here
        int x=22;
        while(x>21){
            x=(rand5()-1)*5+rand5();
        }
        return x%7+1;
    }
};

C++ 解法, 执行用时: 14ms, 内存消耗: 1028KB, 提交时间: 2022-04-07

#include <random>
std::random_device rd;  // Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> distrib(1, 5);
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * rand5() is defined
     * @return a random integer in the range 1 to 7
     */
    int rand5(){
        return distrib(gen);
    }
    int rand7() {
        // write code here
        int x = (rand5() - 1)* 5 + rand5() - 1;
        while(x > 20) {
            x = (rand5() - 1) * 5 + rand5() - 1;
        }
        return x % 7 + 1;
    }
};

C++ 解法, 执行用时: 14ms, 内存消耗: 1036KB, 提交时间: 2022-06-23

#include <random>
std::random_device rd;  // Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> distrib(1, 5);
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * rand5() is defined
     * @return a random integer in the range 1 to 7
     */
    int rand5(){
        return distrib(gen);
    }
    int rand7() {
        // write code here
        int ret = rand5()+(rand5() -1)*5;
        while (ret>21)
        {
            ret = rand5()+rand5()*5;
        }
        return ret%7 + 1;
    }
};

上一题