Random 如何随机填充一维空间?
我想知道如何使用设置数量的项目和目标大小随机填充空间,例如,给定列数=15,目标大小宽度=320,如何随机分配列宽以填充空间?如下图所示,如果可能,任何种类的伪代码或算法都可以Random 如何随机填充一维空间?,random,Random,我想知道如何使用设置数量的项目和目标大小随机填充空间,例如,给定列数=15,目标大小宽度=320,如何随机分配列宽以填充空间?如下图所示,如果可能,任何种类的伪代码或算法都可以 在范围(0320)中创建14个唯一的数字。这些将是钢筋的x位置 创建随机数,与以前的随机数进行比较,然后存储 如果不允许连续行,还应检查它是否与之前的+-1不相等。将320像素划分为15个随机“列”的一种方法是统一划分,即每个列宽遵循相同的分布 对于这一点,您实际上需要一个均匀的分布。实现的第一个方法是yi_H所描述的方
在范围(0320)中创建14个唯一的数字。这些将是钢筋的x位置 创建随机数,与以前的随机数进行比较,然后存储
如果不允许连续行,还应检查它是否与之前的+-1不相等。将320像素划分为15个随机“列”的一种方法是统一划分,即每个列宽遵循相同的分布 对于这一点,您实际上需要一个均匀的分布。实现的第一个方法是yi_H所描述的方法,并且可能是要走的道路:
- 生成0到320之间的14个统一整数
- 继续重新生成任何已选择的数字,以便最终得到14个不同的数字
- 分类
- 列边界由两个连续的随机数给出
- 生成具有相同形状参数的15个指数随机变量(例如1)
- 将每个数字除以总数,使每个数字都在
[0,1]
- 将这些数字乘以320,然后四舍五入。这些是您的列宽
min = 2;
total = 320;
height = 50;
n = 15;
x = Sort[RandomInteger[total - n*min - 1, n - 1]] + Range[n - 1]*min
Graphics[{Rectangle[{-2, 0}, {0, height}], (*left margin*)
Rectangle[{#, 0}, {# + 1, height}] & /@ x, (*columns borders*)
Rectangle[{total, 0}, {total + 2, height}]}, (*right margin*)
PlotRange -> {{-2, total + 2}, {0, height}},
ImageSize -> {total + 4, height}]
with给出了以下示例输出:
编辑:这是修改后的javascript算法(注意,我以前从未编写过javascript,所以可能会有一些错误\风格不好):
函数排序编号(a,b)
{
返回a-b;
}
函数绘图(){
var canvas=document.getElementById(“myCanvas”);
var numberOfStrips=15;
var initPosX=10;
var initPosY=10;
var宽度=320;
var高度=240;
var minColWidth=2;
var reducedWidth=宽度-条带数*最小宽度;
变量分隔符=新数组();
对于(var n=0;n
此外,请注意,
minColWidth
不应大于某个值(reducedWidth
不应为负值…),但未在算法中进行测试。如前所述,如果您不介意两行相邻,则为0;如果您不介意两行相邻,则为1;如果您只想要非空列,则为2或更多。可以是任意值,比如JavaScriptWidth=320意味着什么?这是图像的智慧吗?如果是这样的话,填充是什么意思?我想随机分布列的区域的宽度,我会编辑这个问题,让它更清晰谢谢@FelixCQ的非常详细的解释-你能把代码翻译成类似Javascript的东西吗?thanks@Ricardo-如果你先给一些东西,比如画矩形和几行的代码,我应该可以。酷,如果你在这里查看源代码,我有一个非常基本的javascript代码@Mr.Wizard不,不是真的,因为如果你这样做,你只会保证第一列至少有min
像素宽。您确实需要从total
宽度中删除n
乘以min
宽度,使用常规算法,然后将min
添加回所有列。
function sortNumber(a,b)
{
return a - b;
}
function draw() {
var canvas = document.getElementById( "myCanvas" );
var numberOfStrips = 15;
var initPosX = 10;
var initPosY = 10;
var width = 320;
var height = 240;
var minColWidth = 2;
var reducedWidth = width - numberOfStrips * minColWidth;
var separators = new Array();
for ( var n = 0; n < numberOfStrips - 1; n++ ) {
separators[n] = Math.floor(Math.random() * reducedWidth);
}
separators.sort(sortNumber);
for ( var n = 0; n < numberOfStrips - 1; n++ ) {
separators[n] += (n+1) * minColWidth;
}
if ( canvas.getContext ) {
var ctx = canvas.getContext( "2d" );
// Draw lines
ctx.lineWidth = 1;
ctx.strokeStyle = "rgb( 120, 120, 120 )";
for ( var n = 0; n < numberOfStrips - 1; n++ ) {
var newPosX = separators[n];
ctx.moveTo( initPosX + newPosX, initPosY );
ctx.lineTo( initPosX + newPosX, initPosY + height );
}
ctx.stroke();
// Draw enclosing rectangle
ctx.lineWidth = 4;
ctx.strokeStyle = "rgb( 0, 0, 0 )";
ctx.strokeRect( initPosX, initPosY, width, height );
}
}