我想生成一个小于10的随机整数列表,它们不一样(不同的整数),例如(0,3,1,5,8)。 但是我编写的代码有问题,并且前两个整数始终相同。 如果您的代码告诉我代码的错误或为我提供另一种方法,那会很棒。
vector<int> rand_list(10, 11); //there is ten integers of 11
for (int i = 0; i < 5; i++) // here we make 5 different integers
{
srand(time(NULL));
int r = rand() % 10;
int check = 0;
for (check; check <= i; check++)
{
if (r == rand_list[check])
{
srand(time(NULL));
r = rand() % 10;
check = 0;//I think this line don't force the second loop for to start again.
}
}
rand_list[i] = r;
}
在这里,我希望rand_list具有5个不同的整数,其他项必须为11,但前两个整数始终相同!
答案 0 :(得分:1)
请勿多次致电function( next ) {
if( request.cookies["expire-my-session-cookie"] == "true" ) {
// Set all of the user's cookies to expire immediately:
for( int i = 0; i < request.cookies.length; i++ ) {
response.cookies.setCookie( request.cookies[i].name, "", expires: 1970-01-01 );
}
return response.redirect( 'logoff-handler' );
}
else {
// Otherwise continue as normal:
return next();
}
。 srand()
具有秒精度,因此在同一秒内以time()
作为种子多次调用srand()
会使time()
每次返回相同的数字,这不是事实。你想发生。仅在程序启动时调用rand()
一次。
更好的是,根本不要使用C运行时的随机数生成器。请改用标准的C ++随机数生成器。
对于您的算法,一个更简单的解决方案是将序列号0-9放入数组中,然后运行一个循环,在该数组中生成一个随机索引,然后删除该元素以放入向量中,重复进行直到所有数组元素已用尽,例如:
srand()
或更简单的是,您可以改用标准的#include <algorithm>
#include <random>
std::random_device rd;
std::mt19937 gen(rd());
std::vector<int> rand_list(10);
int numbers[10];
std::generate_n(numbers, 10, [n = 0]() mutable { return n++; });
int avail = 10;
for (int i = 0; i < 10; i++) {
std::uniform_int_distribution<> dis(0, avail-1);
int r = dis(gen);
rand_list[i] = numbers[r];
std::copy(&numbers[r+1], &numbers[avail], &numbers[r]);
--avail;
}
算法,例如:
std::shuffle()
答案 1 :(得分:0)
在程序开始时仅使用srand()
。
然后,一种从一系列值中获取不同随机数的简单方法是:
从尚未使用的一组数字中抽取一个随机数。
这样,您无需重试,也无需检查该号码是否已被使用。
由于std::vector<T>::erase(const_iter it)
不是O(1)
,因此std::vector<T>
可能不是最佳的数据结构。理想情况下,您需要一个数据结构,该数据结构允许在O(1)
中建立索引并在O(1)
中进行擦除。
#include <cstdint>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <cstdio>
int main(int argc, const char* argv[] )
{
using UI16Vec = std::vector<uint16_t>;
UI16Vec numbers;
srand(time(NULL));
// Fill in your range of numbers.
numbers.reserve(10);
for( uint16_t i = 0; i < 10; i++ )
{
numbers.push_back(i);
}
// Pick and remove from numbers.
for( size_t i = 0; i < 5; i++ )
{
size_t index = rand() % numbers.size();
printf("%d: %d\n", i, numbers[index] );
numbers.erase(numbers.cbegin() + index);
}
return 0;
}