Picking a random point along the edge of an areaPicking a random state from a set based on probabilities

Different meanings of こわい

How can I deal with my CEO asking me to hire someone with a higher salary than me, a co-founder?

ssTTsSTtRrriinInnnnNNNIiinngg

Can compressed videos be decoded back to their uncompresed original format?

Examples of smooth manifolds admitting inbetween one and a continuum of complex structures

iPad being using in wall mount battery swollen

Short story with a alien planet, government officials must wear exploding medallions

What does “the session was packed” mean in this context?

Is "remove commented out code" correct English?

Is it inappropriate for a student to attend their mentor's dissertation defense?

How seriously should I take size and weight limits of hand luggage?

Probability that a draw from a normal distribution is some number greater than another draw from the same distribution

Why do bosons tend to occupy the same state?

Detention in 1997

Why can't we play rap on piano?

In 'Revenger,' what does 'cove' come from?

What killed these X2 caps?

How do I handle a potential work/personal life conflict as the manager of one of my friends?

Avoiding the "not like other girls" trope?

What method can I use to design a dungeon difficult enough that the PCs can't make it through without killing them?

What is a romance in Latin?

What's the in-universe reasoning behind sorcerers needing material components?

How to tell a function to use the default argument values?

Why didn't Miles's spider sense work before?



Picking a random point along the edge of an area


Picking a random state from a set based on probabilities













0












$begingroup$


I'm writing a Diffusion-limited aggregation simulation, and need to pick a random point along the edge of an area defined by a dimension pair of [width, height]. The point shouldn't be deep within the area; it should always be on the border of one of the sides. This is the intended behavior:



(let [rand-gen (Random.)
dims [21 11]]

(dotimes [_ 25]
; I'm casting to int so the output it legible
; I actually need doubles
(println
(mapv int (random-edge-coord dims rand-gen)))))

[13 0]
[0 8]
[15 10]
[8 10]
[20 0]
[0 6]
[20 2]
[0 5]
[7 10]
[0 7]
[0 10]
[20 1]
[6 0]
[20 0]
[0 2]
[20 10]
[15 0]
[14 0]
[7 0]
[0 7]
[12 0]
[20 7]
[20 4]
[20 8]
[20 4]


This is the mess I came up with:



; These two functions are just for the sake of a MCVE
(defn- random-boolean [^Random rand-gen]
(.nextBoolean rand-gen))

(defn- random-double [min, max, ^Random rand-gen]
(let [r (.nextDouble rand-gen)
spread (- max min)
rand (* spread r)]
(+ rand min)))

(defn random-edge-coord [dimensions, ^Random rand-gen]
(let [[w h] dimensions
vertical? (random-boolean rand-gen)
start? (random-boolean rand-gen)

x (if vertical?
; Pick either the left or right edge
(if start?
0
(dec w))

; Else, pick a random point along the top/bottom egde
(random-double 0 w rand-gen))

y (if vertical?
(random-double 0 h rand-gen)

(if start?
0
(dec h)))]

[x y]))


The redundancy is killing me though. I can't think of how to clean it up. I feel like this should be fairly straightforward to generalize, but I'm stuck. I figured I could clean up the start? check a bit using an anonymous function like #(if start? 0 (dec %)), which gets rid of the branching lower down, but that's not a huge gain.



Any input here would be appreciated.









share









$endgroup$
















    0












    $begingroup$


    I'm writing a Diffusion-limited aggregation simulation, and need to pick a random point along the edge of an area defined by a dimension pair of [width, height]. The point shouldn't be deep within the area; it should always be on the border of one of the sides. This is the intended behavior:



    (let [rand-gen (Random.)
    dims [21 11]]

    (dotimes [_ 25]
    ; I'm casting to int so the output it legible
    ; I actually need doubles
    (println
    (mapv int (random-edge-coord dims rand-gen)))))

    [13 0]
    [0 8]
    [15 10]
    [8 10]
    [20 0]
    [0 6]
    [20 2]
    [0 5]
    [7 10]
    [0 7]
    [0 10]
    [20 1]
    [6 0]
    [20 0]
    [0 2]
    [20 10]
    [15 0]
    [14 0]
    [7 0]
    [0 7]
    [12 0]
    [20 7]
    [20 4]
    [20 8]
    [20 4]


    This is the mess I came up with:



    ; These two functions are just for the sake of a MCVE
    (defn- random-boolean [^Random rand-gen]
    (.nextBoolean rand-gen))

    (defn- random-double [min, max, ^Random rand-gen]
    (let [r (.nextDouble rand-gen)
    spread (- max min)
    rand (* spread r)]
    (+ rand min)))

    (defn random-edge-coord [dimensions, ^Random rand-gen]
    (let [[w h] dimensions
    vertical? (random-boolean rand-gen)
    start? (random-boolean rand-gen)

    x (if vertical?
    ; Pick either the left or right edge
    (if start?
    0
    (dec w))

    ; Else, pick a random point along the top/bottom egde
    (random-double 0 w rand-gen))

    y (if vertical?
    (random-double 0 h rand-gen)

    (if start?
    0
    (dec h)))]

    [x y]))


    The redundancy is killing me though. I can't think of how to clean it up. I feel like this should be fairly straightforward to generalize, but I'm stuck. I figured I could clean up the start? check a bit using an anonymous function like #(if start? 0 (dec %)), which gets rid of the branching lower down, but that's not a huge gain.



    Any input here would be appreciated.









    share









    $endgroup$














      0












      0








      0





      $begingroup$


      I'm writing a Diffusion-limited aggregation simulation, and need to pick a random point along the edge of an area defined by a dimension pair of [width, height]. The point shouldn't be deep within the area; it should always be on the border of one of the sides. This is the intended behavior:



      (let [rand-gen (Random.)
      dims [21 11]]

      (dotimes [_ 25]
      ; I'm casting to int so the output it legible
      ; I actually need doubles
      (println
      (mapv int (random-edge-coord dims rand-gen)))))

      [13 0]
      [0 8]
      [15 10]
      [8 10]
      [20 0]
      [0 6]
      [20 2]
      [0 5]
      [7 10]
      [0 7]
      [0 10]
      [20 1]
      [6 0]
      [20 0]
      [0 2]
      [20 10]
      [15 0]
      [14 0]
      [7 0]
      [0 7]
      [12 0]
      [20 7]
      [20 4]
      [20 8]
      [20 4]


      This is the mess I came up with:



      ; These two functions are just for the sake of a MCVE
      (defn- random-boolean [^Random rand-gen]
      (.nextBoolean rand-gen))

      (defn- random-double [min, max, ^Random rand-gen]
      (let [r (.nextDouble rand-gen)
      spread (- max min)
      rand (* spread r)]
      (+ rand min)))

      (defn random-edge-coord [dimensions, ^Random rand-gen]
      (let [[w h] dimensions
      vertical? (random-boolean rand-gen)
      start? (random-boolean rand-gen)

      x (if vertical?
      ; Pick either the left or right edge
      (if start?
      0
      (dec w))

      ; Else, pick a random point along the top/bottom egde
      (random-double 0 w rand-gen))

      y (if vertical?
      (random-double 0 h rand-gen)

      (if start?
      0
      (dec h)))]

      [x y]))


      The redundancy is killing me though. I can't think of how to clean it up. I feel like this should be fairly straightforward to generalize, but I'm stuck. I figured I could clean up the start? check a bit using an anonymous function like #(if start? 0 (dec %)), which gets rid of the branching lower down, but that's not a huge gain.



      Any input here would be appreciated.









      share









      $endgroup$




      I'm writing a Diffusion-limited aggregation simulation, and need to pick a random point along the edge of an area defined by a dimension pair of [width, height]. The point shouldn't be deep within the area; it should always be on the border of one of the sides. This is the intended behavior:



      (let [rand-gen (Random.)
      dims [21 11]]

      (dotimes [_ 25]
      ; I'm casting to int so the output it legible
      ; I actually need doubles
      (println
      (mapv int (random-edge-coord dims rand-gen)))))

      [13 0]
      [0 8]
      [15 10]
      [8 10]
      [20 0]
      [0 6]
      [20 2]
      [0 5]
      [7 10]
      [0 7]
      [0 10]
      [20 1]
      [6 0]
      [20 0]
      [0 2]
      [20 10]
      [15 0]
      [14 0]
      [7 0]
      [0 7]
      [12 0]
      [20 7]
      [20 4]
      [20 8]
      [20 4]


      This is the mess I came up with:



      ; These two functions are just for the sake of a MCVE
      (defn- random-boolean [^Random rand-gen]
      (.nextBoolean rand-gen))

      (defn- random-double [min, max, ^Random rand-gen]
      (let [r (.nextDouble rand-gen)
      spread (- max min)
      rand (* spread r)]
      (+ rand min)))

      (defn random-edge-coord [dimensions, ^Random rand-gen]
      (let [[w h] dimensions
      vertical? (random-boolean rand-gen)
      start? (random-boolean rand-gen)

      x (if vertical?
      ; Pick either the left or right edge
      (if start?
      0
      (dec w))

      ; Else, pick a random point along the top/bottom egde
      (random-double 0 w rand-gen))

      y (if vertical?
      (random-double 0 h rand-gen)

      (if start?
      0
      (dec h)))]

      [x y]))


      The redundancy is killing me though. I can't think of how to clean it up. I feel like this should be fairly straightforward to generalize, but I'm stuck. I figured I could clean up the start? check a bit using an anonymous function like #(if start? 0 (dec %)), which gets rid of the branching lower down, but that's not a huge gain.



      Any input here would be appreciated.







      clojure fractals





      share












      share










      share



      share










      asked 3 mins ago









      CarcigenicateCarcigenicate

      3,82811632




      3,82811632




















          0






          active

          oldest

          votes












          Your Answer





          StackExchange.ifUsing("editor", function ()
          return StackExchange.using("mathjaxEditing", function ()
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          );
          );
          , "mathjax-editing");

          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "196"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f216819%2fpicking-a-random-point-along-the-edge-of-an-area%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f216819%2fpicking-a-random-point-along-the-edge-of-an-area%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          बाताम इन्हें भी देखें सन्दर्भ दिक्चालन सूची1°05′00″N 104°02′0″E / 1.08333°N 104.03333°E / 1.08333; 104.033331°05′00″N 104°02′0″E / 1.08333°N 104.03333°E / 1.08333; 104.03333

          Why is the 'in' operator throwing an error with a string literal instead of logging false?Why can't I use switch statement on a String?Python join: why is it string.join(list) instead of list.join(string)?Multiline String Literal in C#Why does comparing strings using either '==' or 'is' sometimes produce a different result?How to initialize an array's length in javascript?How can I print literal curly-brace characters in python string and also use .format on it?Why does ++[[]][+[]]+[+[]] return the string “10”?Why is char[] preferred over String for passwords?Why does this code using random strings print “hello world”?jQuery.inArray(), how to use it right?

          How can we generalize the fact of finite dimensional vector space to an infinte dimensional case?$k[x]$-module and cyclic module over a finite dimensional vector spaceSubspace of a finite dimensional space is finite dimensionalIf V is an infinite-dimensional vector space, and S is an infinite-dimensional subspace of V, must the dimension of V/S be finite? ExplainWhy is an infinite dimensional space so different than a finite dimensional one?base for finite dimensional vector space is not infinite dimensional vector space?Any finite-dimensional vector space is the dual space of anotherHaving Trouble Understanding Meaning Of A Finite-Dimensional Vector SpaceProve that “Every subspaces of a finite-dimensional vector space is finite-dimensional”Ring as a finite dimensional Vector space over a field KQuestion regarding basis and dimension