我正在尝试随机选择两个数字之一:2
或-2
。有办法吗?我正在尝试实现创建迷宫的算法。
答案 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)
生成一个随机数:0
或1
。
<< 2
将前一个结果乘以4
,而-
前面的-((rand() & 1) << 2)
取反,所以结果是0
或-4
。
+ 2
添加2
,因此结果为2
或-2
。
如果您希望看到一种更像算术的方法,可能更容易遵循,那就是:
rand % 2 * -4 + 2