Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:生成由一个特定的“";“保证金”;_Javascript_D3.js_Random - Fatal编程技术网

javascript:生成由一个特定的“";“保证金”;

javascript:生成由一个特定的“";“保证金”;,javascript,d3.js,random,Javascript,D3.js,Random,我想在a和b之间生成x随机数。每个x随机数不应比y更接近其他数: 如果y=100那么我不应该生成500和555,但是500和601就可以了 更多背景: 我想用d3.js生成x圆,它们彼此不接触(所以y将是较大圆的半径)。我可以使用类似的方法,但我更喜欢不使用force()的方法。最简单的方法是循环使用Math.random(),直到得到不在禁飞区的答案。缺点是对Math.random进行一些不必要的调用,但是如果禁飞空间与范围相比很小,那么它就不重要了 更新:避免结果的历史记录。有趣 let

我想在
a
b
之间生成
x
随机数。每个
x
随机数不应比
y
更接近其他数:

如果
y=100
那么我不应该生成500和555,但是500和601就可以了


更多背景:
我想用
d3.js
生成
x
圆,它们彼此不接触(所以
y
将是较大圆的半径)。我可以使用类似的方法,但我更喜欢不使用
force()

的方法。最简单的方法是循环使用Math.random(),直到得到不在禁飞区的答案。缺点是对Math.random进行一些不必要的调用,但是如果禁飞空间与范围相比很小,那么它就不重要了

更新:避免结果的历史记录。有趣

let history = [];
function myRand(range, margin) {
    while(true) {
        let result = Math.trunc(Math.random() * range);
        if (history.every(last => {
            return Math.abs(result - last) > margin;
        })) {
            history.push(result);
            return result;
        }
    }
}

for (let i = 0; i < 5; i++)
    console.log(myRand(100, 10));
let history=[];
函数myRand(范围、边距){
while(true){
让结果=Math.trunc(Math.random()*范围);
如果(历史记录)。每(最后一次=>{
返回Math.abs(result-last)>margin;
})) {
历史。推(结果);
返回结果;
}
}
}
for(设i=0;i<5;i++)
控制台日志(myRand(100,10));

我会制作一个简单的b-树,并在行进中跟踪节点。这应该是非常快速和可靠的

设最大值为100
设MIN=0
设缓冲区=10
设MAXCOUNT=6
函数随机性(最小值、最大值){
返回{
val:Math.floor(Math.random()*(max-min+1)+min)
}
}
函数addLeaves(f,min=min-BUFFER,max=max+BUFFER,arr=[])){
如果(arr.length>=MAXCOUNT)返回arr
到达推力(f.val)
f、 左=(最小+缓冲区log(res)
这里有另一种方法,尽管我觉得它不那么随机。在狭窄空间的情况下,它不会有无限循环的风险

function randomWithMargin(start, stop, count, margin) {
    let spacing = Math.trunc((stop - start) / count);
    let left = start;
    let right = start + spacing;

    let results = [];
    while (count--) {
        let r = left + Math.trunc(Math.random() * (right - left));
        results.push(r);
        left = r + margin;    // ensure next number is at least margin from last
        right += spacing;    
    }
    return results;
}

console.log(randomWithMargin(10, 110, 10, 7));

谢谢,但我很难看到如何扩展您的代码以生成类似25个随机数的内容。假设这50个数字应该在0到1000之间,留有20的余量。啊,我明白了,你想要避免一系列的数字,而不仅仅是最后一个。正如@GerardoFurtado提到的,这并不特别有效。如果在给定余量的数字之间没有空间,它将永远循环。另外,还不清楚第三个参数是什么时候在函数调用中
myRand(100,50,10)
是的,我在回答中指出了这一点。这实际上取决于数字空间是否拥挤。如果空间拥挤,你可能需要更复杂的东西。嘿,你如何启用“运行代码片段”功能?嘿@JimBaldwin-如果你将代码添加为“片段”(发布答案时会有一个按钮)它会让它在适当的位置运行。@JimBaldwin请不要这样做,因为你接受的答案:它会冻结浏览器。@Mark\M我避免回答这个问题,因为它对我来说似乎是个大问题。@JimBaldwin不,它不会:想象第一个值是30,第二个值是70。
while
循环将永远运行。只要试一下你的代码,你就会看到。当用大边距调用时,这似乎给出了超出范围的数字。例如:
randomWithMargin(10,110,10,70)
返回
[10,74,141,92,114,149,125,183,178,222]