質問
これは、1つの1つのステートメントで数字のセットからC ++での乱数を印刷することは可能ですか?
のはセットであると言う{2、5、22、55、332}
私は(RANDを見上げた)が、私はそれが1つのステートメントで行うことが可能だ疑います。
解決
(それは可能性エクイ作るために)あなたが得たすべての5を乗じたランダムな値を見つけることで、これらの数字はサイズ5のセットであると言います。ランド()メソッドを想定して5で同じあなたの乗算1の範囲0の間のランダムな値を返し、あなたがインデックスからフェッチする0と4.の間に等確率の値を取得しますそれを整数にキャストします。
私はC ++の文法を知りません。しかし、これは、それがどのように見えるべきかです。
my_rand_val = my_set[(int)(rand()*arr_size)]
ここでは、関数rand()は0と1の間の値を返すメソッドであると仮定します。
他のヒント
int numbers[] = { 2, 5, 22, 55, 332 };
int length = sizeof(numbers) / sizeof(int);
int randomNumber = numbers[rand() % length];
無意味に単一の式に物事を回すには三項演算子が何であったか、実質的にはの発明したのために(私はlitbの複合文の策略のどれを持っていないよ):
std::cout << ((rand()%5==0) ? 2 :
(rand()%4==0) ? 5 :
(rand()%3==0) ? 22 :
(rand()%2==0) ? 55 :
332
) << std::endl;
私のコード投稿者に私にラットはありませんしてください。
ああ、ここで私たちは、あなたが多分一気に、「単一の文」と呼ぶことができるもの。
で適切な均一な分布を(仮定rand()
は、その範囲で均一である)に行きます
これは、反復文だが、そのように複数の文を含む巨大なブロックとのforループです。構文は区別しません。これは、実際には2つのステートメントが含まれています。全体のことは声明で、for(...)
の一部を除いた全てのものは文です。だから、おそらく、「単一のステートメントは、」これではない、単一の式文を意味します。しかし、いずれにせよます:
// weasel #1: #define for brevity. If that's against the rules,
// it can be copy and pasted 7 times below.
#define CHUNK ((((unsigned int)RAND_MAX) + 1) / 5)
// weasel #2: for loop lets me define and use a variable in C++ (not C89)
for (unsigned int n = 5*CHUNK; n >= 5*CHUNK;)
// weasel #3: sequence point in the ternary operator
((n = rand()) < CHUNK) ? std::cout << 2 << "\n" :
(n < 2*CHUNK) ? std::cout << 5 << "\n" :
(n < 3*CHUNK) ? std::cout << 22 << "\n" :
(n < 4*CHUNK) ? std::cout << 55 << "\n" :
(n < 5*CHUNK) ? std::cout << 332 << "\n" :
(void)0;
// weasel #4: retry if we get one of the few biggest values
// that stop us distributing values evenly between 5 options.
これは、プログラム全体でのコードだけになるだろう、とあなたはそれが同じ値を毎回返すようにしたくない場合は、、あなたはsrand()
を呼び出す必要があります。幸いなことに、これは中に装着することができるの最初の行を変更します。
for (unsigned int n = (srand((time(0) % UINT_MAX)), 5*CHUNK); n >= 5*CHUNK;)
さて、私たちは再びこの日の話を決してせます。
はい、それは可能です。非常に直感的しかし、あなたはそれを求めていない。
#include <time.h>
#include <stdlib.h>
#include <iostream>
int main()
{
srand(time(0));
int randomNumber = ((int[]) {2, 5, 22, 55, 332})[rand() % 5];
std::cout << randomNumber << std::endl;
return 0;
}
あなたの「単一のステートメント」の基準は非常にあいまいです。あなたは、1つのマシン命令、1つのSTDLIBコールを意味するのですか?
1台のマシン命令を意味する場合は、、答えは特別なハードウェアなし、なしです。
あなたは一つの関数呼び出しを意味する場合は、、そして、もちろん、それは可能です。あなたが欲しいものを行うための簡単な関数を書くことができます:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int setSize = 5;
int set[] = {2, 5, 22, 55, 332 };
srand( time(0) );
int number = rand() % setSize;
printf("%d %d", number, set[number]);
return 0;
}