在 C++ 中使用 srand() 的测试用例的新值集
New set of values for testcases using srand() in c++
我正在尝试为我的 'minimum dot product' 问题创建一些测试用例。我想要 10 个测试用例,每个测试用例都为向量 a 和 b 生成不同的一组值。
问题是,即使在使用 srand( time( NULL ) )
之后,我每次编译和 运行 代码时都会生成一个新的输入,但所有 10 个测试用例都使用相同的输入。
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using std::vector;
void sort_asc(vector<int> &manav, int sizes)
{
int temp = 0;
for (int i = 0; i<sizes; i++)
{
for (int j = i + 1; j<sizes; j++)
{
if (manav[i] > manav[j])
{
temp = manav[i];
manav[i] = manav[j];
manav[j] = temp;
}
}
}
std::cout << "b in asc order : ";
for (int i = 0; i<sizes; i++)
{
std::cout << manav[i] << " ";
}
std::cout << std::endl;
}
void sort_desc(vector<int> &manav, int sizes)
{
int temp = 0;
for (int i = 0; i<sizes; i++)
{
for (int j = i + 1; j<sizes; j++)
{
if (manav[i] < manav[j])
{
temp = manav[i];
manav[i] = manav[j];
manav[j] = temp;
}
}
}
std::cout << "a in desc : ";
for (int i = 0; i<sizes; i++)
{
std::cout << manav[i] << " ";
}
std::cout << std::endl;
}
long long min_dot_product(vector<int> a, vector<int> b, int sizes) {
long long result = 0;
sort_desc(a, sizes);
sort_asc(b, sizes);
for (size_t i = 0; i < sizes; i++) {
result += a[i] * b[i];
}
return result;
}
int main() {
srand(time(NULL));
/*
std::cin >> n;
vector<int> a(n), b(n);
for (size_t i = 0; i < n; i++) {
std::cin >> a[i];
}
for (size_t i = 0; i < n; i++) {
std::cin >> b[i];
}
*/
//================================================================ TESTING =========================================================================
int z = 0;
int n = (rand() % 10) + 1; // generating the size of the vectors [1-10]
std::cout << "n = " << n << "\n";
vector<int> a;
vector<int> b;
while (z != 10) {
for (int i = 0; i < n; ++i)
{
int p = (rand() % 10) - 5;
a.push_back(p); // input values [-5,4] in 'a'
}
std::cout << "Unsorted Vector a = ";
for (int i = 0; i<n; i++)
{
std::cout << a[i] << " ";
}
std::cout << std::endl;
for (int i = 0; i < n; ++i)
{
int q = (rand() % 10) - 5;
b.push_back(q); // inputing values [-5,4] in 'b'
}
std::cout << "Unsorted Vector b = ";
for (int i = 0; i<n; i++)
{
std::cout << b[i] << " ";
}
std::cout << std::endl;
std::cout << "min_dot_product = " << min_dot_product(a, b, n) << std::endl;
z++;
}
return 0;
}
每次我 运行 代码时,我都想为所有 10 个测试用例生成一组不同的向量 a 和 b 值。
在将值推送到向量中之前,我已经在各自的 for 循环中尝试了 srand(i)
,但它对我不起作用,而且在 for 循环中重复使用 srand( time( NULL ) )
也无济于事。还有其他一些简单的方法可以实现吗?
问题是您永远不会在每次迭代时清除向量。由于您没有将生成的所有新随机数都添加到向量的末尾,因此您忽略了它们,因为 n
永远不会改变。
你需要做的是添加
a.clear();
b.clear();
到 while 循环结束。这将清除向量,然后当您开始下一次迭代时,新的随机数将添加到您在函数中使用的向量部分。
您还可以将矢量设置为适当的大小,然后使用 []
访问元素。这样您就可以覆盖以前的值,而不必调用 clear()
vector<int> a(n);
vector<int> b(n);
//...
for (int i = 0; i < n; ++i)
{
a[i] = (rand() % 10) - 5;
b[i] = (rand() % 10) - 5;
}
我将两个赋值放在同一个 for 循环中以保存 space。您可以在两个单独的循环中执行此操作,但这不是必需的。
我正在尝试为我的 'minimum dot product' 问题创建一些测试用例。我想要 10 个测试用例,每个测试用例都为向量 a 和 b 生成不同的一组值。
问题是,即使在使用 srand( time( NULL ) )
之后,我每次编译和 运行 代码时都会生成一个新的输入,但所有 10 个测试用例都使用相同的输入。
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using std::vector;
void sort_asc(vector<int> &manav, int sizes)
{
int temp = 0;
for (int i = 0; i<sizes; i++)
{
for (int j = i + 1; j<sizes; j++)
{
if (manav[i] > manav[j])
{
temp = manav[i];
manav[i] = manav[j];
manav[j] = temp;
}
}
}
std::cout << "b in asc order : ";
for (int i = 0; i<sizes; i++)
{
std::cout << manav[i] << " ";
}
std::cout << std::endl;
}
void sort_desc(vector<int> &manav, int sizes)
{
int temp = 0;
for (int i = 0; i<sizes; i++)
{
for (int j = i + 1; j<sizes; j++)
{
if (manav[i] < manav[j])
{
temp = manav[i];
manav[i] = manav[j];
manav[j] = temp;
}
}
}
std::cout << "a in desc : ";
for (int i = 0; i<sizes; i++)
{
std::cout << manav[i] << " ";
}
std::cout << std::endl;
}
long long min_dot_product(vector<int> a, vector<int> b, int sizes) {
long long result = 0;
sort_desc(a, sizes);
sort_asc(b, sizes);
for (size_t i = 0; i < sizes; i++) {
result += a[i] * b[i];
}
return result;
}
int main() {
srand(time(NULL));
/*
std::cin >> n;
vector<int> a(n), b(n);
for (size_t i = 0; i < n; i++) {
std::cin >> a[i];
}
for (size_t i = 0; i < n; i++) {
std::cin >> b[i];
}
*/
//================================================================ TESTING =========================================================================
int z = 0;
int n = (rand() % 10) + 1; // generating the size of the vectors [1-10]
std::cout << "n = " << n << "\n";
vector<int> a;
vector<int> b;
while (z != 10) {
for (int i = 0; i < n; ++i)
{
int p = (rand() % 10) - 5;
a.push_back(p); // input values [-5,4] in 'a'
}
std::cout << "Unsorted Vector a = ";
for (int i = 0; i<n; i++)
{
std::cout << a[i] << " ";
}
std::cout << std::endl;
for (int i = 0; i < n; ++i)
{
int q = (rand() % 10) - 5;
b.push_back(q); // inputing values [-5,4] in 'b'
}
std::cout << "Unsorted Vector b = ";
for (int i = 0; i<n; i++)
{
std::cout << b[i] << " ";
}
std::cout << std::endl;
std::cout << "min_dot_product = " << min_dot_product(a, b, n) << std::endl;
z++;
}
return 0;
}
每次我 运行 代码时,我都想为所有 10 个测试用例生成一组不同的向量 a 和 b 值。
在将值推送到向量中之前,我已经在各自的 for 循环中尝试了 srand(i)
,但它对我不起作用,而且在 for 循环中重复使用 srand( time( NULL ) )
也无济于事。还有其他一些简单的方法可以实现吗?
问题是您永远不会在每次迭代时清除向量。由于您没有将生成的所有新随机数都添加到向量的末尾,因此您忽略了它们,因为 n
永远不会改变。
你需要做的是添加
a.clear();
b.clear();
到 while 循环结束。这将清除向量,然后当您开始下一次迭代时,新的随机数将添加到您在函数中使用的向量部分。
您还可以将矢量设置为适当的大小,然后使用 []
访问元素。这样您就可以覆盖以前的值,而不必调用 clear()
vector<int> a(n);
vector<int> b(n);
//...
for (int i = 0; i < n; ++i)
{
a[i] = (rand() % 10) - 5;
b[i] = (rand() % 10) - 5;
}
我将两个赋值放在同一个 for 循环中以保存 space。您可以在两个单独的循环中执行此操作,但这不是必需的。