#include <utility>
#include <iostream>
#include <cstdlib>
template< typename Ret, typename Last >
Ret random_picker_impl( size_t i, Last&& last )
{
return std::forward<Last>(last);
}
template< typename Ret, typename First, typename Second, typename ... Rest >
Ret random_picker_impl( size_t i, First&& first, Second&& second, Rest&&... rest )
{
if( i == 0 )
{
return std::forward<First>(first);
}
else
{
return random_picker_impl<Ret>( i-1, std::forward<Second>(second), std::forward<Rest>(rest)... );
}
}
template< typename First, typename ... Rest >
First random_picker( First&& first, Rest&&... rest )
{
size_t index = (sizeof...(rest) + 1) * (std::rand() / double(RAND_MAX));
return random_picker_impl<First>( index, std::forward<First>(first), std::forward<Rest>(rest)... );
}
int main()
{
for( int i=0; i<20; ++i )
{
auto i = random_picker( 1, 2, 3 );
std::cout << "chose: " << i << '\n';
}
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNzdGRsaWI+Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgUmV0LCB0eXBlbmFtZSBMYXN0ID4KUmV0IHJhbmRvbV9waWNrZXJfaW1wbCggc2l6ZV90IGksIExhc3QmJiBsYXN0ICkKewogICByZXR1cm4gc3RkOjpmb3J3YXJkPExhc3Q+KGxhc3QpOwp9Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgUmV0LCB0eXBlbmFtZSBGaXJzdCwgdHlwZW5hbWUgU2Vjb25kLCB0eXBlbmFtZSAuLi4gUmVzdCA+ClJldCByYW5kb21fcGlja2VyX2ltcGwoIHNpemVfdCBpLCBGaXJzdCYmIGZpcnN0LCBTZWNvbmQmJiBzZWNvbmQsIFJlc3QmJi4uLiByZXN0ICkKewogICBpZiggaSA9PSAwICkKICAgewogICAgICByZXR1cm4gc3RkOjpmb3J3YXJkPEZpcnN0PihmaXJzdCk7CiAgIH0KICAgZWxzZQogICB7CiAgICAgIHJldHVybiByYW5kb21fcGlja2VyX2ltcGw8UmV0PiggaS0xLCBzdGQ6OmZvcndhcmQ8U2Vjb25kPihzZWNvbmQpLCBzdGQ6OmZvcndhcmQ8UmVzdD4ocmVzdCkuLi4gKTsKICAgfQp9Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgRmlyc3QsIHR5cGVuYW1lIC4uLiBSZXN0ID4KRmlyc3QgcmFuZG9tX3BpY2tlciggRmlyc3QmJiBmaXJzdCwgUmVzdCYmLi4uIHJlc3QgKQp7CiAgIHNpemVfdCBpbmRleCA9IChzaXplb2YuLi4ocmVzdCkgKyAxKSAqIChzdGQ6OnJhbmQoKSAvIGRvdWJsZShSQU5EX01BWCkpOwogICByZXR1cm4gcmFuZG9tX3BpY2tlcl9pbXBsPEZpcnN0PiggaW5kZXgsIHN0ZDo6Zm9yd2FyZDxGaXJzdD4oZmlyc3QpLCBzdGQ6OmZvcndhcmQ8UmVzdD4ocmVzdCkuLi4gKTsKfQoKaW50IG1haW4oKQp7CiAgIGZvciggaW50IGk9MDsgaTwyMDsgKytpICkKICAgewogICAgICBhdXRvIGkgPSByYW5kb21fcGlja2VyKCAxLCAyLCAzICk7CiAgICAgIHN0ZDo6Y291dCA8PCAiY2hvc2U6ICIgPDwgaSA8PCAnXG4nOwogICB9Cn0K