Skip to content
By using Twitter’s services you agree to our Cookies Use. We and our partners operate globally and use cookies, including for analytics, personalisation, and ads.

This is the legacy version of twitter.com. We will be shutting it down on June 1, 2020. Please switch to a supported browser, or disable the extension which masks your browser. You can see a list of supported browsers in our Help Center.

  • Home Home Home, current page.
  • About

Saved searches

  • Remove
  • In this conversation
    Verified accountProtected Tweets @
Suggested users
  • Verified accountProtected Tweets @
  • Verified accountProtected Tweets @
  • Language: English
    • Bahasa Indonesia
    • Bahasa Melayu
    • Català
    • Čeština
    • Dansk
    • Deutsch
    • English UK
    • Español
    • Filipino
    • Français
    • Hrvatski
    • Italiano
    • Magyar
    • Nederlands
    • Norsk
    • Polski
    • Português
    • Română
    • Slovenčina
    • Suomi
    • Svenska
    • Tiếng Việt
    • Türkçe
    • Ελληνικά
    • Български език
    • Русский
    • Српски
    • Українська мова
    • עִבְרִית
    • العربية
    • فارسی
    • मराठी
    • हिन्दी
    • বাংলা
    • ગુજરાતી
    • தமிழ்
    • ಕನ್ನಡ
    • ภาษาไทย
    • 한국어
    • 日本語
    • 简体中文
    • 繁體中文
  • Have an account? Log in
    Have an account?
    · Forgot password?

    New to Twitter?
    Sign up
colmmacc's profile
Colm MacCárthaigh
Colm MacCárthaigh
Colm MacCárthaigh
@colmmacc

Tweets

Colm MacCárthaigh

@colmmacc

AWS, Apache, Crypto, Irish Music, Haiku, Photography

Seattle
notesfromthesound.com
Joined April 2008

Tweets

  • © 2020 Twitter
  • About
  • Help Center
  • Terms
  • Privacy policy
  • Imprint
  • Cookies
  • Ads info
Dismiss
Previous
Next

Go to a person's profile

Saved searches

  • Remove
  • In this conversation
    Verified accountProtected Tweets @
Suggested users
  • Verified accountProtected Tweets @
  • Verified accountProtected Tweets @

Promote this Tweet

Block

  • Tweet with a location

    You can add location information to your Tweets, such as your city or precise location, from the web and via third-party applications. You always have the option to delete your Tweet location history. Learn more

    Your lists

    Create a new list


    Under 100 characters, optional

    Privacy

    Copy link to Tweet

    Embed this Tweet

    Embed this Video

    Add this Tweet to your website by copying the code below. Learn more

    Add this video to your website by copying the code below. Learn more

    Hmm, there was a problem reaching the server.

    By embedding Twitter content in your website or app, you are agreeing to the Twitter Developer Agreement and Developer Policy.

    Preview

    Why you're seeing this ad

    Log in to Twitter

    · Forgot password?
    Don't have an account? Sign up »

    Sign up for Twitter

    Not on Twitter? Sign up, tune into the things you care about, and get updates as they happen.

    Sign up
    Have an account? Log in »

    Two-way (sending and receiving) short codes:

    Country Code For customers of
    United States 40404 (any)
    Canada 21212 (any)
    United Kingdom 86444 Vodafone, Orange, 3, O2
    Brazil 40404 Nextel, TIM
    Haiti 40404 Digicel, Voila
    Ireland 51210 Vodafone, O2
    India 53000 Bharti Airtel, Videocon, Reliance
    Indonesia 89887 AXIS, 3, Telkomsel, Indosat, XL Axiata
    Italy 4880804 Wind
    3424486444 Vodafone
    » See SMS short codes for other countries

    Confirmation

     

    Welcome home!

    This timeline is where you’ll spend most of your time, getting instant updates about what matters to you.

    Tweets not working for you?

    Hover over the profile pic and click the Following button to unfollow any account.

    Say a lot with a little

    When you see a Tweet you love, tap the heart — it lets the person who wrote it know you shared the love.

    Spread the word

    The fastest way to share someone else’s Tweet with your followers is with a Retweet. Tap the icon to send it instantly.

    Join the conversation

    Add your thoughts about any Tweet with a Reply. Find a topic you’re passionate about, and jump right in.

    Learn the latest

    Get instant insight into what people are talking about now.

    Get more of what you love

    Follow more accounts to get instant updates about topics you care about.

    Find what's happening

    See the latest conversations about any topic instantly.

    Never miss a Moment

    Catch up instantly on the best stories happening as they unfold.

    1. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
      • Report Tweet
      • Report NetzDG Violation

      Have you ever needed to generate a random number in code? whether it's for rolling a dice, or shuffling a set, this tweet thread is here for you! There's no reason that it should be easy or obvious, very experienced programmers repeat common mistakes. I did, before I learned ...

      38 replies 947 retweets 2,806 likes
      Show this thread
      Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
      • Report Tweet
      • Report NetzDG Violation

      O.k. let's start with the most common problem, and the most common mistakes: how do we pick a random number between 0 and N inclusive, let's say N = 5, so like a dice that starts at zero because we're nerds.

      8:31 AM - 29 Jun 2018
      • 1 Retweet
      • 53 Likes
      • tinyrobots Daivat Bhatt Özgür Şahin Nomusa M RideDaArc Johann Großschädl Andrew Wooster
      1 reply 1 retweet 53 likes
        1. New conversation
        2. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          A common solution is to r = rand() % (N + 1). Easy, right? Wrong! This solution is biased. To see how, imagine that RAND_MAX is "15". 0 % 6 == 0, 6 % 6 == 0, and 12 % 6 == 0 , so there are three rand() values each that return 0. Same works for 1, 2, 3 ...

          6 replies 6 retweets 63 likes
          Show this thread
        3. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          But there are only two rand() values that return 4: 4 % 6 and 10 % 6. Same for 5. So 0, 1, 2, 3 are all 50% more likely than 4 or 5. That's bias! Of course with a big RAND_MAX, this bias diminishes, but it's still there. So don't do it this way.

          1 reply 2 retweets 42 likes
          Show this thread
        4. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          O.k. so what if we use a float to avoid this? It's tempting! We can build a float between 0.0 and 1.0 by doing f = (float) rand() / (float) RAND_MAX. So we build a little macro or function for that, and now we can just do r = randFloat() * 5, right?

          2 replies 1 retweet 20 likes
          Show this thread
        5. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          No! This doesn't work other, because FLOATING POINT IS LIES. The distribution between 0.0 and 1.0 is not evenly spread and there's all sorts of rounding fuzziness that will make r non-uniform. No good.

          5 replies 8 retweets 89 likes
          Show this thread
        6. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          The solution here is pretty interesting and totally non-intuitive. What you have to do is to compute the highest multiple of n that is smaller than RAND_MAX. Then you call rand() and if you get a number that's higher, you discard it and go again. E.g. https://github.com/awslabs/s2n/blob/643976c1c03c7f4a3003d7e066f18536c410c2b4/utils/s2n_random.c#L166 …

          2 replies 22 retweets 148 likes
          Show this thread
        7. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          int random(int max) { while(1) { int r = rand(): if (r < (RAND_MAX - (RAND_MAX % max))) { return r % max; } } }

          5 replies 9 retweets 131 likes
          Show this thread
        8. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          O.k, so there's some probability that this program might never finish! HALTING PROBLEM, etc, etc. The probability is worst when max == (RAND_MAX / 2) + 1. But even then it's a very rapidly diminishing binomial distribution ... so we just shrug our shoulders. It's fine.

          4 replies 1 retweet 46 likes
          Show this thread
        9. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          This is why you should use those APIs that ask for the max, that's why they exist, and this is what's going on under the hood. But if you have to do it yourself. This is how. O.k. next, what if we need to random selection ...

          2 replies 4 retweets 56 likes
          Show this thread
        10. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          OBVIOUSLY to select elements at random, you can just throw them in an array, and choose a random index into the array. But this is BORING. This is a terrible approach for weighted sets, if you want to favor some elements, and it's also common that you want to choose multiples ...

          1 reply 2 retweets 27 likes
          Show this thread
        11. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          And when you choose multiples, you usually don't want duplicates, so what you often need is a shuffle. How do you shuffle? Well you can call sort() with some kind of customer random as-me comparator. DON'T DO THIS.

          2 replies 3 retweets 28 likes
          Show this thread
        12. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          Also, DON'T LET YOUR FRIENDS DO THIS. Instead do a Fisher-Yates shuffle. They are super easy ...

          3 replies 1 retweet 51 likes
          Show this thread
        13. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          jumble = [ A , B , C, D, E, F ] for (i = 0; i < jumble.length; i++) { int r = rand(i) save = jumble[i] jumble[i] = jumble[r] jumble[r] = save It's O(N) and it works every time. Super easy to remember if you code it a few times.

          8 replies 9 retweets 147 likes
          Show this thread
        14. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          O.k. so that's shuffling, like for your playlist or whatever. But what about weighted sets and selection? What if you want to choose elements but also put a thumb on the scale?

          1 reply 2 retweets 19 likes
          Show this thread
        15. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          Well you could build a set or an array that just repeats elements in them w times, where w is the weight. Eats a lot of space though! and gets super inefficient if you don't want to have duplicates. The COOLEST answer here is to use Vose's Alias.

          1 reply 4 retweets 28 likes
          Show this thread
        16. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          Sadly, this one is too long for a tweet until next year when twitter decides that we need more space to offend one another, so for now, bookmark this page http://www.keithschwarz.com/darts-dice-coins/ … , or print it out and frame it in case the Internet ever dies. It's one of the best bits.

          2 replies 12 retweets 175 likes
          Show this thread
        17. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          You can read it for yourself, but it uses a 2d approach to do weighted selection in O(1) time with O(n) space. MAD THAT THIS WORKS. And it reminds me of something else, the last and BONUS randomness item I'll get into ...

          3 replies 3 retweets 32 likes
          Show this thread
        18. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          How do we generate numbers that honor a normal distribution?

          3 replies 0 retweets 18 likes
          Show this thread
        19. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          A normal distribution is a super common statistical distribution, it describes the distribution of lots of phenomena and the central limit theorem says that basically any distribution is secretly just one step removed from the normal distribution.

          1 reply 1 retweet 21 likes
          Show this thread
        20. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          That probably didn't make any sense. Here's a Wikipedia page that also won't make much sense: https://en.wikipedia.org/wiki/Normal_distribution … . It especially doesn't make sense that those totally differently looking lines are supposed to be "the same". That's ok though.

          1 reply 1 retweet 22 likes
          Show this thread
        21. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          It's ok because STATISTICS DOESN'T MAKE SENSE. They work really well, but if you think about them for too long and too deeply, you fall into a transcendent state. That's also how we know that statistics are pure science. Anyway, back to the topic ...

          2 replies 20 retweets 114 likes
          Show this thread
        22. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          A cool, though not common any more, way to generate normally distributed numbers is called the Box-Muller transform, https://en.wikipedia.org/wiki/Box–Muller_transform …, and it combines the "Just throw the bad crap away" (aka rejection sampling) and two-dimensional approaches we've seen already.

          1 reply 2 retweets 34 likes
          Show this thread
        23. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          With Box-Muller, we choose two random values, between -2^^31 and 2^^31 say, we plot them as x and y on a two dimensional plane. If (x,y) lies within the circle of radius size 2^^31, we keep the point, otherwise we go again. r is the distance from the origin to (x, y) squared.

          1 reply 0 retweets 21 likes
          Show this thread
        24. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          Here's a picture from Wikipedia, but basically we're throwing darts at a square and if they land in a circle we're good. It's amazing how much low-level stuff is dumb-as-rocks.pic.twitter.com/pQ97dvdD8x

          2 replies 3 retweets 54 likes
          Show this thread
        25. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          O.k. some parting thoughts before ending this thread. First, if you need to generate random numbers in constant time, or exotic distributions, get super deep into this stuff. There are seriously rough weeds to tackle.

          2 replies 1 retweet 27 likes
          Show this thread
        26. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          Second: if you find yourself building a whole RNG, it's really very hard, again, get deep in the weeds and learn about DRBGs, fork-safety, thread-safety, /dev/urandom, getrandom() and so on. Avoid if you can!

          4 replies 0 retweets 28 likes
          Show this thread
        27. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          Third: always use a secure RNG, your language or programming environment should have one. *Don't* ever seed an RNG yourself. One exception: for fuzz inputs and other tests, where you may want repeat deterministically for debugging. But DON'T LET IT LEAK INTO PRODUCTION.

          4 replies 1 retweet 45 likes
          Show this thread
        28. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          Another exception is games, where you may want to generate content and play based on a small seed value, BUT UNDERSTAND THAT THIS IS NOT SECURE.

          3 replies 0 retweets 31 likes
          Show this thread
        29. Colm MacCárthaigh‏ @colmmacc 29 Jun 2018
          • Report Tweet
          • Report NetzDG Violation

          Last tip: always measure your little random functions with a histogram or whatever. I still code these wrong and have to check. Thanks for reading!

          11 replies 7 retweets 127 likes
          Show this thread
        30. End of conversation

      Loading seems to be taking a while.

      Twitter may be over capacity or experiencing a momentary hiccup. Try again or visit Twitter Status for more information.

        Promoted Tweet

        false

        • © 2020 Twitter
        • About
        • Help Center
        • Terms
        • Privacy policy
        • Imprint
        • Cookies
        • Ads info