如何随机选择两个值?

时间:2020-02-01 15:16:05

标签: c random numbers

我正在尝试随机选择两个数字之一:2-2。有办法吗?我正在尝试实现创建迷宫的算法。

3 个答案:

答案 0 :(得分:2)

您有C标准库中的rand(),该库返回范围为[0,const mongoose = require('mongoose'); const Schema = mongoose.Schema; // define schema const messageSchema = Schema({ sender: { type: Schema.Types.ObjectId, ref: 'User' }, recipient: { type: Schema.Types.ObjectId, ref: 'User' }, createdAt: { type: Date, default: Date.now }, deletedAt: { type: Date, default: undefined }, readAt: { type: Date, default: undefined}, message: { type: String, maxlength: 5000 } }); // create a model based on that schema const Message = mongoose.model('Message', messageSchema); // Export the message model ... not the schema module.exports.Message = Message; ]的伪随机整数。您可以使用此功能并选择两个数字之一,以检查返回的值是高于还是低于RAND_MAX

首先,使用srand()使用一些种子初始化伪随机数生成器。通常使用time()来执行此操作,因为每次都会返回一个不同的值。

RAND_MAX/2

或者,您可以使用this other answer中建议的srand(time(NULL)); int rnd = rand(); int result = (rnd > RAND_MAX/2) ? 2 : -2; 返回值的最低有效位,因为返回值的一半是奇数,一半是偶数。

rand()

答案 1 :(得分:1)

有很多方法可以做到这一点,我最喜欢的是:

a + rand() % 2 * (b - a);

不清楚是做什么的,并且对效率没有贡献(当然,如果您将其设置为宏/内联函数,从来没有与变量一起使用过,现代的编译器应该在编译时评估数字),因此,做到这一点的最优雅的方法是使用某种条件,这是一个三元运算符的示例:

(rand() % 2)? a: b;

顺便说一句:有很多方法可以在0/1之间进行选择,我使用rand()%2是因为它是最常用的技术, 但是,如果您恰好在没有模/除的6502架构上执行此操作,则可以使用像 rand()和ANY_POWER_OF_TWO 或这样的 rand()>的按位和运算符进行操作HALF_MAX_RAND

答案 2 :(得分:0)

您可以使用它。它使用按位运算来生成2-2而不分支:

-((rand() & 1) << 2) + 2

我注意到您应先使用srand()为随机数生成器添加种子;我通常使用srand(time(NULL))

分步操作:

  • (rand() & 1)生成一个随机数:01

  • << 2将前一个结果乘以4,而-前面的-((rand() & 1) << 2)取反,所以结果是0-4

  • + 2添加2,因此结果为2-2

如果您希望看到一种更像算术的方法,可能更容易遵循,那就是:

rand % 2 * -4 + 2