Random 如何随机填充一维空间?

Random 如何随机填充一维空间?,random,Random,我想知道如何使用设置数量的项目和目标大小随机填充空间,例如,给定列数=15,目标大小宽度=320,如何随机分配列宽以填充空间?如下图所示,如果可能,任何种类的伪代码或算法都可以 在范围(0320)中创建14个唯一的数字。这些将是钢筋的x位置 创建随机数,与以前的随机数进行比较,然后存储 如果不允许连续行,还应检查它是否与之前的+-1不相等。将320像素划分为15个随机“列”的一种方法是统一划分,即每个列宽遵循相同的分布 对于这一点,您实际上需要一个均匀的分布。实现的第一个方法是yi_H所描述的方

我想知道如何使用设置数量的项目和目标大小随机填充空间,例如,给定列数=15,目标大小宽度=320,如何随机分配列宽以填充空间?如下图所示,如果可能,任何种类的伪代码或算法都可以


在范围(0320)中创建14个唯一的数字。这些将是钢筋的x位置

创建随机数,与以前的随机数进行比较,然后存储


如果不允许连续行,还应检查它是否与之前的+-1不相等。

将320像素划分为15个随机“列”的一种方法是统一划分,即每个列宽遵循相同的分布

对于这一点,您实际上需要一个均匀的分布。实现的第一个方法是yi_H所描述的方法,并且可能是要走的道路:

  • 生成0到320之间的14个统一整数
  • 继续重新生成任何已选择的数字,以便最终得到14个不同的数字
  • 分类
  • 列边界由两个连续的随机数给出
如果您有最小宽度要求(例如,非空列为1),请将其从320像素中删除15次,生成新范围内的数字并进行必要的调整

在单纯形上实现统一点的第二种方法有点复杂,不太适合离散设置,如像素,但这里简单介绍一下:

  • 生成具有相同形状参数的15个指数随机变量(例如1)
  • 将每个数字除以总数,使每个数字都在
    [0,1]
  • 将这些数字乘以320,然后四舍五入。这些是您的列宽
这并不像第一种方法那么好,因为使用舍入法,最终的结果可能大于或小于320,并且可能有宽度为0的列。。。唯一的优点是,您不需要执行任何排序(但必须计算对数…因此,总而言之,第一种方法是可行的)

我应该补充一点,如果你不一定想要统一的随机填充,那么你可以使用更多的算法

编辑:这里是Mathematica中第一个算法的快速实现。请注意,为了避免生成点,直到它们都是不同的,可以只考虑空列的宽度为1,然后最小宽度为2将给出具有非空内部的列:

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 );
   }
}