如何从随机数输出文本
How to output text from a random number
我对 c++ 非常陌生,我想知道如何从随机数生成器输出文本。
我正在创建一个文字游戏。你偶尔会打架,我希望你的输赢是随机的。例如,如果随机数是 2(唯一的选择是一个或两个),那么它会说:“你输了!”。请保持简单的答案,因为我是新手,解释您的解决方案将是完美的。
提前致谢。
如果只有两个选项,最快的方法是只对最低有效位的值感兴趣。
if(randomNumber & 1) // equals 1 if the LSB is set.
cout << "You won!" << endl;
else
cout << "You lost!" << endl;
#include <cstdlib>
#include <iostream>
#include <ctime>
int main()
{
std::srand(std::time(0)); // use current time as seed for random generator
int random_variable = std::rand();
std::cout << "Random value on [0 " << RAND_MAX << "]: "
<< random_variable << '\n';
}
来源:http://en.cppreference.com/w/cpp/numeric/random/rand
然后,您可以将它与常量变量进行比较并执行任何操作,例如:
if (random_variable > 2)
doSomething();
else
doSomethingElse();
#include<iostream>
using namespace std;
int main()
{int ran_num=0;
srand((unsigned)time(0));
while(ran_num !=2) //You can add options here.
{ran_num=rand() % 100;//You can change the max number.
cout<<ran_num<<" "<<endl;
}
cout<<"You lost!";}
由于你的随机输出只有两种状态,你可以把它想象成抛硬币,所以你可以取一个随机函数并进行模除以 2,就像这个例子(只需要寻找 'coin toss' 你会得到大量的样本):
http://www.c-program-example.com/2012/05/c-program-to-toss-coin-using-random.html
int toss = rand() % 2;
您可以使用投掷来管理您的选择。
既然这里提出了这么多rand
的用法,那我们就做的更稳健一点:
- 我们将使用
std::random_device
轻松了解 <random>
的工作原理。 (你可以在这里使用 time(0)
,这并不重要。)
- 我们实际的 PRNG(生成数字的东西)将是 [
std::mt19937_64
](http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine],它被认为是更好的随机数生成器之一。
- 我们不会简单地检查一个位,而是告诉 C++ 我们想要 [0,1] 范围内的数字。
- 我们会将其组合成一个您只需要调用的对象。
- 一个简单的比较就可以让我们决定玩家的输赢。
所以,从数字 1 开始:
#include <random>
#include <functional>
#include <iostream>
int main() {
using namespace std; // because I am lazy today
random_device seeder; // call this to get a number
// more to do here
}
现在,虽然 seeder()
给出了一个随机数,但通常希望您只使用它来播种您自己的 PRNG(除非您进行加密,在这种情况下它会变得更加复杂)。那么,让我们开始吧:
mt19937_64 prng(seeder());
嗯,这很简单。现在,让我们做一个分配:
uniform_int_distribution<int> distribution(0, 1);
现在,要获得 0
或 1
的 int
,我们可以将 prng 扔到分布中,如:
int one_or_zero = distribution(prng);
但是,这很麻烦。因此,我们只是将所有内容结合起来,而不是前面的步骤:
auto dist = bind(uniform_int_distribution<int>(0, 1), mt19937_64(seeder()));
您可以将其解读为“让我成为一个名为 dist
的类似函数的变量,它保持 [0, 1] 范围内的均匀分布(每个值与其他值一样)通过 Mersenne Twister 64 PRNG。
我们现在需要做的是:
int one_or_zero = dist();
好的,我们只需要围绕对 dist
的调用包装一点 if
- 听起来很简单:
if(dist() == 0) {
cout << "You won!\n";
} else {
cout << "Sorry, you lost.\n";
}
您可以在操作 here 中看到结果,但请注意结果已缓存,因此您需要对其进行分叉并 运行 自己查看它的变化。
P.S.: 请注意,它会产生恰好两行的语义类似于(稍微交换一下,你会得到完全相同的语义)srand
/rand
-- 除了它避免了一大堆与这些功能相关的问题。
我对 c++ 非常陌生,我想知道如何从随机数生成器输出文本。 我正在创建一个文字游戏。你偶尔会打架,我希望你的输赢是随机的。例如,如果随机数是 2(唯一的选择是一个或两个),那么它会说:“你输了!”。请保持简单的答案,因为我是新手,解释您的解决方案将是完美的。
提前致谢。
如果只有两个选项,最快的方法是只对最低有效位的值感兴趣。
if(randomNumber & 1) // equals 1 if the LSB is set.
cout << "You won!" << endl;
else
cout << "You lost!" << endl;
#include <cstdlib>
#include <iostream>
#include <ctime>
int main()
{
std::srand(std::time(0)); // use current time as seed for random generator
int random_variable = std::rand();
std::cout << "Random value on [0 " << RAND_MAX << "]: "
<< random_variable << '\n';
}
来源:http://en.cppreference.com/w/cpp/numeric/random/rand
然后,您可以将它与常量变量进行比较并执行任何操作,例如:
if (random_variable > 2)
doSomething();
else
doSomethingElse();
#include<iostream>
using namespace std;
int main()
{int ran_num=0;
srand((unsigned)time(0));
while(ran_num !=2) //You can add options here.
{ran_num=rand() % 100;//You can change the max number.
cout<<ran_num<<" "<<endl;
}
cout<<"You lost!";}
由于你的随机输出只有两种状态,你可以把它想象成抛硬币,所以你可以取一个随机函数并进行模除以 2,就像这个例子(只需要寻找 'coin toss' 你会得到大量的样本):
http://www.c-program-example.com/2012/05/c-program-to-toss-coin-using-random.html
int toss = rand() % 2;
您可以使用投掷来管理您的选择。
既然这里提出了这么多rand
的用法,那我们就做的更稳健一点:
- 我们将使用
std::random_device
轻松了解<random>
的工作原理。 (你可以在这里使用time(0)
,这并不重要。) - 我们实际的 PRNG(生成数字的东西)将是 [
std::mt19937_64
](http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine],它被认为是更好的随机数生成器之一。 - 我们不会简单地检查一个位,而是告诉 C++ 我们想要 [0,1] 范围内的数字。
- 我们会将其组合成一个您只需要调用的对象。
- 一个简单的比较就可以让我们决定玩家的输赢。
所以,从数字 1 开始:
#include <random>
#include <functional>
#include <iostream>
int main() {
using namespace std; // because I am lazy today
random_device seeder; // call this to get a number
// more to do here
}
现在,虽然 seeder()
给出了一个随机数,但通常希望您只使用它来播种您自己的 PRNG(除非您进行加密,在这种情况下它会变得更加复杂)。那么,让我们开始吧:
mt19937_64 prng(seeder());
嗯,这很简单。现在,让我们做一个分配:
uniform_int_distribution<int> distribution(0, 1);
现在,要获得 0
或 1
的 int
,我们可以将 prng 扔到分布中,如:
int one_or_zero = distribution(prng);
但是,这很麻烦。因此,我们只是将所有内容结合起来,而不是前面的步骤:
auto dist = bind(uniform_int_distribution<int>(0, 1), mt19937_64(seeder()));
您可以将其解读为“让我成为一个名为 dist
的类似函数的变量,它保持 [0, 1] 范围内的均匀分布(每个值与其他值一样)通过 Mersenne Twister 64 PRNG。
我们现在需要做的是:
int one_or_zero = dist();
好的,我们只需要围绕对 dist
的调用包装一点 if
- 听起来很简单:
if(dist() == 0) {
cout << "You won!\n";
} else {
cout << "Sorry, you lost.\n";
}
您可以在操作 here 中看到结果,但请注意结果已缓存,因此您需要对其进行分叉并 运行 自己查看它的变化。
P.S.: 请注意,它会产生恰好两行的语义类似于(稍微交换一下,你会得到完全相同的语义)srand
/rand
-- 除了它避免了一大堆与这些功能相关的问题。