用随机数填充向量
Filling in a vector with random numbers
我正在尝试使用 srand
打印随机数。这是我的代码。
我希望列表中的每个后续数字都大于前一个数字。
这是我的代码。
#include <iostream>
#include <ctime>
#include <cmath>
#include <random>
#include <vector>
#include <algorithm>
#include <climits> // for INT_MAX;
int main(){
srand((int)time(0));
std::vector<int> myVec;
int number = 5;
for(size_t index = 0; index <100; index++){
int result = (rand() % number) +1;
if((result % 5) == 0 or (result % 5 == 3 && index == 50)){
number += 2;
myVec.push_back(number);
}
}
for(int vec : myVec){
std::cout << vec << " ";
}
return 0;
}
我正在寻找的输出是
0 2 4 6 9 12 等等
有人可以指导我如何实现吗?
你应该能把这个写得简单很多。此外,您的代码似乎没有获得任何随机值的原因是因为您用 myVec.push_back(number)
推回了您的界限。你应该改为 myVec.push_back(result)
.
至于你的实际问题,你的代码似乎并没有按照你想要实现的目标来编写。如果你想得到比后面的值大0-4的值,最好这样写:
#include <iostream>
#include <ctime>
#include <random>
#include <vector>
int main(){
srand(time(0));
std::vector<int> nums;
int lower = 0;
for(int i=0; i<100; i++) {
// generate random number from lower bound to upper bound
// starting lower bound is 0
nums.push_back((rand() % 5) + lower);
lower = nums[nums.size()-1];
}
for(int num : nums){
std::cout << num << " ";
}
std::cout << "\n";
return 0;
}
所以,一般来说,如果随机函数是 returning 任何值 x,其中 0 <= x < 1
(我相信 C/C++ rand() 确实如此),那么得到一个给定范围内的值,您希望采用这种格式:
(rand() % (upper_bound - lower_bound + 1)) + lower_bound
但是,您说过您希望所有值都比下限大 0-4。这意味着我们基本上想从我们的下限开始,并向其添加 0-4。所以实际上,我们只需要生成一个 0-4 之间的随机数。上面的代码执行 rand() % 5
因为 rand() % N
将 return 任何数字 x where 0 <= x < N
。所以,我们想要做 rand() % 5
,它会得到从 0 到 4 的任何数字。
此外,这只是语义,但根据我个人的经验,尝试对变量命名保持一定程度的推断总是好的。在你的 for-each 循环中你写了 for(int vec : myVec)
,但是乍一看,这可能看起来 myVec 实际上是一个 向量的向量 ,而 myVec 的每个元素都是一个矢量本身。尽管明确声明了 int
类型,但如果它的类型不是向量,开发人员仍然很容易混淆为什么将其命名为“vec”。再一次,其中一些归结为偏好,以及这是针对个人项目、任务还是实际生产代码。但我会开始养成一个好习惯,确保事物的命名是有目的的。
我正在尝试使用 srand
打印随机数。这是我的代码。
我希望列表中的每个后续数字都大于前一个数字。
这是我的代码。
#include <iostream>
#include <ctime>
#include <cmath>
#include <random>
#include <vector>
#include <algorithm>
#include <climits> // for INT_MAX;
int main(){
srand((int)time(0));
std::vector<int> myVec;
int number = 5;
for(size_t index = 0; index <100; index++){
int result = (rand() % number) +1;
if((result % 5) == 0 or (result % 5 == 3 && index == 50)){
number += 2;
myVec.push_back(number);
}
}
for(int vec : myVec){
std::cout << vec << " ";
}
return 0;
}
我正在寻找的输出是
0 2 4 6 9 12 等等
有人可以指导我如何实现吗?
你应该能把这个写得简单很多。此外,您的代码似乎没有获得任何随机值的原因是因为您用 myVec.push_back(number)
推回了您的界限。你应该改为 myVec.push_back(result)
.
至于你的实际问题,你的代码似乎并没有按照你想要实现的目标来编写。如果你想得到比后面的值大0-4的值,最好这样写:
#include <iostream>
#include <ctime>
#include <random>
#include <vector>
int main(){
srand(time(0));
std::vector<int> nums;
int lower = 0;
for(int i=0; i<100; i++) {
// generate random number from lower bound to upper bound
// starting lower bound is 0
nums.push_back((rand() % 5) + lower);
lower = nums[nums.size()-1];
}
for(int num : nums){
std::cout << num << " ";
}
std::cout << "\n";
return 0;
}
所以,一般来说,如果随机函数是 returning 任何值 x,其中 0 <= x < 1
(我相信 C/C++ rand() 确实如此),那么得到一个给定范围内的值,您希望采用这种格式:
(rand() % (upper_bound - lower_bound + 1)) + lower_bound
但是,您说过您希望所有值都比下限大 0-4。这意味着我们基本上想从我们的下限开始,并向其添加 0-4。所以实际上,我们只需要生成一个 0-4 之间的随机数。上面的代码执行 rand() % 5
因为 rand() % N
将 return 任何数字 x where 0 <= x < N
。所以,我们想要做 rand() % 5
,它会得到从 0 到 4 的任何数字。
此外,这只是语义,但根据我个人的经验,尝试对变量命名保持一定程度的推断总是好的。在你的 for-each 循环中你写了 for(int vec : myVec)
,但是乍一看,这可能看起来 myVec 实际上是一个 向量的向量 ,而 myVec 的每个元素都是一个矢量本身。尽管明确声明了 int
类型,但如果它的类型不是向量,开发人员仍然很容易混淆为什么将其命名为“vec”。再一次,其中一些归结为偏好,以及这是针对个人项目、任务还是实际生产代码。但我会开始养成一个好习惯,确保事物的命名是有目的的。