gpt4 book ai didi

c++ - 生成两个随机数,使一个总是大于另一个

转载 作者:行者123 更新时间:2023-12-03 18:41:49 24 4
gpt4 key购买 nike

我正在对我的函数 myFunc() 的以下问题进行压力测试。

有一座石桥连接着两个城市。从一个城市开始的第一 block 石头上刻有 1,最后一 block 石头在另一个城市一侧。每个后续的石头上都有两个连续的数字,除了最后一个石头上可能有一个或两个数字,具体取决于 N 的值。石头可以排列为 1, (2, 3), (4, 5), (6, 7)... N。

给你一个数字 N,代表最后一 block 石头上的最后一个数字;和数字 X。任务是找到从第一城市一侧或第二城市一侧到达刻有 X 的石头所需的最少跳跃次数。注意:在第一 block 石头上跳跃将被计为 0 次跳跃。

例子:输入:2个10 35 1

输出:1个0

解释:测试用例 1:N = 10 的石头排列如下:1, (2, 3), (4, 5), (6, 7), (8, 9), 10要在 X = 3 上跳跃,您只需要从第一城市一侧跳一次(因为第一次跳石不会被计算在内),从第二城市一侧跳 4 次。所以 1 和 4 中的最小值是 1。

测试用例 2:N = 5 的石头排列如下:1, (2, 3), (4, 5)要在 X = 1 上跳跃,您只需要从第一城市一侧跳零次(因为第一次跳石不会被计算在内),从第二城市一侧跳 2 次。所以 0 和 2 中的最小值是 0。

#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;

int myFunc(int n, int p) {
return p / 2;
}

int findJumps(int n, int p){
return min(X /2, (N / 2) - (X / 2));
}
int main() {
int n, x;
srand(time(0));
while(true) {

n = rand() % 40 + 1; // I want n to be always greater than x
x = rand() % 40 + 1;
if(myFunc(n, x) != findJumps(n, x)) {
cout << n << " " << x;
break;
}

else cout << n << " " << x;
cout << endl;
}
return 0;
}

我希望我的代码在无限循环范围内生成始终大于 X 的 N。我如何强制执行此条件?

最佳答案

首先让我建议您避免使用 rand(完全)和 % 将其输出限制在特定范围内。如果您确实坚持这样做,请跳到下面的 C 库 部分,了解至少半合理的方法。

现代图书馆

C++ 11 引入了一组新的类来生成随机数,并将随机数减少到指定范围。虽然使用它们有点复杂——有些部分(比如播种)有点困难,而其他部分(比如缩小到一个范围)则相当简单——至少如果你关心把工作做好。

我还要注意,如果 0 < x < n,则 n 的下限必须是 2,而不是 1

使用 C++ 11 随机数生成类,您可以按以下一般顺序执行某些操作:

std::mt19937 gen{ std::random_device()() };

// ...

int n = std::uniform_int_distribution<int>(2, 40)(gen);
int x = std::uniform_int_distribution<int>(1, n)(gen);

如果你真的关心随机数的质量,你可能想走得更远——现在,这只使用来自 std::random_device 的单个返回值来为生成器播种,但 mt19937 生成器实际上具有比这大得多的状态,因此较大的种子会更好。如果你想了解这个,你可能想看看 std::seed_seq作为起点。

C 库

如果您打算使用 rand()% 将您的数字减少到正确的范围内,我想我应该先编写一个小函数来生成指定范围内的随机数1:

int rand_range(int lower, int upper) { 
int range = upper - lower;

return rand() % range + lower;
}

然后我会用它来生成数字:

n = rand_range(2, 40);
x = rand_range(1, n);

[同上,n的下限必须是2。]

另一种可能性是生成这两个数字,然后如果它们的顺序错误,则交换它们。尽管如此,这仍然留下了它们相等的可能性,并且消除这种可能性将需要更多的工作——因此前面的建议只是为了确保当您生成 x 时,它始终严格小于 n.


<支持>1. 请注意,除非 rand() 的范围恰好是 40 的倍数(不太可能是这种情况),否则使用 % 这样会产生有偏见的结果。如果你想做得更好,你可以看看 https://stackoverflow.com/a/2999130/179910对于稍微改进的方法——但是现代库部分中显示的标准分布确实是正确的方法。

关于c++ - 生成两个随机数,使一个总是大于另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60745087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com