有没有办法在JavaScript中生成指定范围内的随机数(例如1到6:1,2,3,4,5或6)?
我今天正在查看一个在线游戏物理库,并遇到了~~运算符.我知道单个〜是一个按位NOT,是否会使~~不是NOT,它会返回相同的值,不是吗?
在JavaScript中生成随机字母数字(大写,小写和数字)字符串以用作可能唯一标识符的最短方式(在合理范围内)是什么?
我试过这个:
float a = 1.4123;
a = a & (1 << 3);
Run Code Online (Sandbox Code Playgroud)
我得到一个编译错误,说操作数&不能是float类型.
当我做:
float a = 1.4123;
a = (int)a & (1 << 3);
Run Code Online (Sandbox Code Playgroud)
我让程序运行.唯一的事情是按位操作是在舍入后获得的数字的整数表示上完成的.
以下也是不允许的.
float a = 1.4123;
a = (void*)a & (1 << 3);
Run Code Online (Sandbox Code Playgroud)
我不明白为什么int可以投,void*但不是float.
我这样做是为了解决Stack Overflow问题中描述的问题如何使用遗传算法求解线性方程?.
我在JS项目中找到了以下代码:
var a = new Array();
a[0] = 0;
for (var b = 0; b < 10; b++) {
a[0] |= b;
}
Run Code Online (Sandbox Code Playgroud)
|=for循环体内有什么作用?
代码示例是可疑的,但V8 已经在这里提供了一个改进性能的示例.
更新的示例
上面的例子相当于var a = [15];大多数意图和目的.|=操作员的一个更现实的例子是在单个变量中设置二进制标志,例如在权限对象上:
//Set up permission masks
var PERMISSION_1_MASK = parseInt('0001',2);
var PERMISSION_2_MASK = parseInt('0010',2);
..
//Set up permissions
userPermissions = 0;
userPermissions |= hasPermissionOne && PERMISSION_1_MASK;
userPermissions |= hasPermissionTwo && PERMISSION_2_MASK;
..
//Use permissions
if(userPermissions & PERMISSION_1_MASK){
..//Do stuff only allowed by permission 1 …Run Code Online (Sandbox Code Playgroud) D3教程提供了一个产生随机序列的函数:
var t = 1297110663, // start time (seconds since epoch)
v = 70, // start value (subscribers)
data = d3.range(33).map(next); // starting dataset
function next() {
return {
time: ++t,
value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5)))
};
}
Run Code Online (Sandbox Code Playgroud)
注意~~(tilda tilda):
value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5)))
Run Code Online (Sandbox Code Playgroud)
从在javascript终端中玩游戏,我看到:
~~1
1
~~-1
-1
~~-1.3
-1
parseInt(5)
5
parseInt(-5)
-5
parseInt(-5.3)
-5
parseInt(5.3)
5
Run Code Online (Sandbox Code Playgroud)
既然~~和parseInt似乎是等价的,那么使用parseInt的理由是什么?
我正在尝试这个Codewars挑战,问题涉及找到一个数的除数,然后计算这些除数的平方和.我找到了解决这个问题的两种方法.
第一种方法是基于另一个关于找到所有除数之和的Stackoverflow问题,并且最初看起来很聪明:
function divisorsSquared(n) {
// create a numeric sequence and then reduce it
return [...Array(n+1).keys()].slice(1)
.reduce((sum, num)=>sum+(!(n % (num)) && Math.pow(num,2)), 0);
}
Run Code Online (Sandbox Code Playgroud)
我使用的第二种方法是使用简单的for循环:
function divisorsSquared(n) {
var sum = 0;
for(var i = 1; i<= n; i++){
if(n % i === 0) sum += Math.pow(i,2);
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
现在我注意到第一种方法明显慢于第二种方法,快速jsperf测试证实了这一点.
我的问题是:为什么第一种方法如此慢,哪种方法在生产代码中更可取?
在Codewars上我注意到,对于许多挑战,使用类似的数组方法有一些聪明的单行解决方案.作为一个初学者,即使性能更差,这些解决方案可能被认为是比for循环更好的做法吗?
我在node.js库的源代码中找到了这段代码.~~对input变量有什么影响?
inArray[3] = ~~input;
Run Code Online (Sandbox Code Playgroud)
它还以其他方式使用:
return ~~ ((a - b) / 864e5 / 7 + 1.5);
Run Code Online (Sandbox Code Playgroud) 我有一个变种;
它的价值可以 NaN, null and any +ve/-ve number including 0.
我需要一个过滤掉a的所有值的条件,只有> = 0的值在if条件下产生一个真值.
实现这一目标的最佳方法是什么,我不希望使用3种不同的条件 ||
让我说我有x = 12.345.在javascript中,哪个函数floatToInt(x)有最快的运行时间floatToInt(12.345)返回12?
javascript ×9
performance ×2
random ×2
arrays ×1
c++ ×1
casting ×1
jquery ×1
node.js ×1
numbers ×1