[HN Gopher] Wi Flag (2002)
       ___________________________________________________________________
        
       Wi Flag (2002)
        
       Author : corysama
       Score  : 486 points
       Date   : 2023-02-10 17:11 UTC (1 days ago)
        
 (HTM) web link (asheron.fandom.com)
 (TXT) w3m dump (asheron.fandom.com)
        
       | DanHulton wrote:
       | God I miss Asheron's Call.
       | 
       | I had a character named Sal Monella, and I ran around the various
       | major hubs trading people a single Fried Egg.
       | 
       | Good times.
        
       | hesdeadjim wrote:
       | Some of my fondest gaming memories are from this game. There was
       | nothing ever quite like it, and the allegiance system created a
       | special type of community bond that I haven't seen repeated.
       | 
       | At one point I had 10 "vassals" sworn to me, and in our
       | allegiance that came with the expectation that you assist and
       | mentor those under you. Stakes were higher when our allegiance
       | committed to being red dot PKs on a white server with a few other
       | stronger groups in play.
       | 
       | The server emulation scene has come a long way since retail shut
       | down, but even the most populous servers are a pale shade of this
       | game in its hey day.
        
         | loganc2342 wrote:
         | MMOs are just so expensive to develop now that innovation is
         | almost dead. You either make a WoW-like or you die (and many
         | times you die anyway). They really don't make MMOs like they
         | used to.
        
           | dualboot wrote:
           | That's because AC started development before even Ultima
           | Online launched. It was started by a bunch of college
           | students that loved MUDs and had no idea what they were
           | actually doing.
           | 
           | It was such a special thing before it was hit with a lot of
           | road grading over the 15+ years of monthly patching that
           | smoothed a lot of the rough edges that made it really unique.
        
           | tsgagnon wrote:
           | Social media has taken a significant bite out of what I would
           | consider the more important parts of the older MMOs,
           | especially when it comes to apps like Discord. Not enough
           | people want to interact in games anymore outside of specific
           | gameplay scenarios.
        
           | bob1029 wrote:
           | > MMOs are just so expensive to develop now that innovation
           | is almost dead.
           | 
           | I look at this differently. I think the extreme cost of an
           | MMO should _force_ innovation. Take the constraints for what
           | they are and run with them. Accepting that you can 't do it
           | the "traditional" way is the first step to figuring out a
           | better way.
           | 
           | There is nothing that says a high-quality WoW killer
           | absolutely must cost 10 figures to produce.
        
             | Thaxll wrote:
             | It does though, MMO are very complicated to do and there is
             | a lot of tech to build by specialized people. The content
             | is an other issue. You won't build anythinng close to wow
             | bellow 100M.
        
             | munificent wrote:
             | Social media apps : MMOS :: Reality TV : Fiction television
             | shows
        
         | gourneau wrote:
         | I also loved this game it was my first MMO, and in many ways
         | was so ahead of its time. I still dream about it occasionally.
        
       | NKosmatos wrote:
       | I enjoy reading such stories, where the software fault (or
       | glitch) is something very simple and easily overlooked. Mind you,
       | this story is from 2002 :-)
        
       | jjcm wrote:
       | Love bug deep dives like these. Along a similar line is the
       | "foxes lead users to treasure" behavior in Skyrim:
       | https://twitter.com/JoelBurgess/status/1428008041887281157
        
         | shihab wrote:
         | I don't quite get the bug, that is what exactly makes the fox
         | follow regions of denser triangles?
        
           | lanternfish wrote:
           | Basic probability - randomly walking a graph will tend to
           | have you in regions of higher vertex density. Same reason why
           | randomly picking a road intersection will tend to put you in
           | cities - cities just have most of the intersections.
           | 
           | (the walk isn't exactly random but it still works - the
           | pathing heuristic is real-coordinate agnostic).
        
       | TheRealPomax wrote:
       | tl;dr: players get attacked based on monster targeting RNG that's
       | _supposed_ to take an interval [0,num_players], assign players to
       | subintervals that are shorter or longer based on a bunch of
       | factors, and then roll a random number somewhere in that full
       | interval. Whoever 's subinterval the number ends in, they get
       | targetted.
       | 
       | Instead, the code assigned subintervals and then rolled a number
       | between 0 and 1, instead of 0 and num_players. If your player
       | happened to sort to the top of the list for subinterval
       | assignment, you'd be it. You'd always be it.
       | 
       | Someone had to think to look at this, then confirm the maths,
       | before it was found, _years_ after the symptoms got reported. A
       | unit test would have caught this, but didn 't. Writing tests is
       | annoying, especially in a codebase that keeps changing, but it's
       | _so_ important that this should count as one of those  "this is
       | what happens when you don't" lessons. Money was lost here.
        
         | squeaky-clean wrote:
         | Was money lost here? Everyone in this thread who played AC is
         | speaking pretty fondly of the bug.
        
         | toast0 wrote:
         | > A unit test would have caught this, but didn't.
         | 
         | Unit tests for things with probability are hard. I've written
         | one recently, and among other reasons, it convinced me to write
         | the selection differently so it was both more 'fair' and more
         | easily tested.
        
         | btown wrote:
         | My startup integrates with numerous third-party data sources,
         | and they'll send quotes in all shapes and colors, usually
         | providing both a total and a complicated breakdown which we
         | need to parse and reshape/classify into line items in our
         | system. And since it's very easy to introduce a bug that skips
         | over a fee accidentally, part of our code review checklist is
         | to ensure that we always explicitly check that our code summing
         | over our final line items sums to the actual ground-truth
         | total; we have a runtime assertion that logs an error to Sentry
         | and, depending on business requirements, shows a (friendly)
         | error rather than incorrect pricing. It's saved us many a time
         | from silly bugs where we're non-exhaustively handling parts of
         | the breakdown data structure.
         | 
         | To generalize, it's vital to have something like Sentry from
         | day one - a low-cost abstraction that lets you monitor broken
         | assumptions asynchronously. Though of course, these kinds of
         | tools didn't exist in 2002!
        
         | thecapybara wrote:
         | > A unit test would have caught this, but didn't
         | 
         | The first unit testing library, JUnit (Java), was released in
         | 1997.
         | 
         | Asheron's Call was released in 1999 after four years of
         | development. It's quite possible that this bug was introduced
         | before the concept of unit testing even existed or was widely
         | known.
        
         | hinkley wrote:
         | > Writing tests is annoying, especially in a codebase that
         | keeps changing
         | 
         | Only if you don't have a functional core.
         | 
         | One of the psychology tricks I've learned about unit testing is
         | just how bad sunk cost fallacy affects some people (all the
         | time, and most people some of the time). I've witnessed people
         | pairing for two days to fix a couple of nasty integration
         | tests. That's 3 person-days of work lost on a couple of tests.
         | How many release cycles would it take for that test to pay for
         | itself versus manual testing?
         | 
         | You want the tests at the bottom of your pyramid to be so
         | simple that people think of them as disposable. They should not
         | feel guilty deleting one test and writing a replacement if the
         | requirements change. Elaborate mocks or poorly organized suites
         | can take that away. Which is hard to explain to people who
         | don't see the problem with their tests.
         | 
         | You also want the sides of that pyramid to be pretty shallow,
         | especially if you keep changing your design.
        
         | jefftk wrote:
         | _> You 'd always be it._
         | 
         | It's slightly more complex than that: if you were farther away
         | or otherwise in a better position than average your portion of
         | the interval would be <1, and so even if you sorted first you
         | still weren't guaranteed to be hit.
        
           | TheRealPomax wrote:
           | Until you were actually taking part in combat and did damage
           | to something, at which point you'd be it.
        
         | SamBam wrote:
         | > A unit test could have caught this
         | 
         | I've always wondered the best way to write tests for "This
         | event should happen x% of the time."
         | 
         | Obviously we could re-run the test 100 times and see if it
         | happened _close_ to x%, but not only is that inefficient, how
         | close is  "close"? You'll get a bell curve (or similar), and
         | most of the time you'll be close to x but sometimes you'll be
         | legitimately far away from x and your test will fail.
         | 
         | You could start from a known seed, but then are you really
         | testing the percentages, or just checking that the RNG gives
         | you the same output for the same seed, which you already know?
        
           | pkhuong wrote:
           | > I've always wondered the best way to write tests for "This
           | event should happen x% of the time."
           | 
           | I use https://github.com/pkhuong/csm/blob/master/csm.py to
           | set a known false alarm rate (e.g., one in a billion) and
           | test that some event happens with probability in a range [lo,
           | hi], with lo < expected < hi (e.g., expected +/- 0.01). The
           | statistical test will run more iteration as needed. If that's
           | too slow, you can either widen the range (most effective), or
           | increase the expected rate of false alarms (not as effective,
           | because the number of iteration scales logarithmically wrt
           | false alarms).
        
           | perlgeek wrote:
           | This is pretty hard to black-box test.
           | 
           | What would have helped in this case:
           | 
           | * Test that all players _can_ be selected by the algorithm at
           | all
           | 
           | * Test that the totals of the weights is the same as the RNG
           | max range
        
             | hinkley wrote:
             | Scatter plots are good when you can't exhaustively test.
        
           | hashkb wrote:
           | You can mock the RNG. You don't need to test/prove it's
           | random, you need to test your code which is not random.
        
             | hinkley wrote:
             | unit tests are notoriously bad about testing n>2. I just
             | ran into a problem with sorting recently that was caused by
             | buggy comparators, but it didn't bubble up to the tests
             | until the runtime switched to a different sort
             | implementation. Most of the tests were doing n=2 so it was
             | not visible under the old runtime version but was under the
             | new one. This has been broken in production for months if
             | not years. If the test had used n=5 I'm pretty sure the old
             | tests would fail as well.
        
           | delecti wrote:
           | You would probably not test "happens x% of the time", but
           | rather that for a given set of inputs, passing in 0.1, 0.2,
           | 0.3, etc, let you have the expected outcomes across the
           | distribution. So you're testing that you can achieve each
           | outcome across the spectrum with a pre-selected "random"
           | number.
        
           | OkayPhysicist wrote:
           | I'm not a fan of the set-seed solution. In the past, when
           | I've tested PRNG implementations (Erlang used to not have the
           | ability to have multiple, independently seeded RNGs), my
           | approach was to decide on an acceptable rate of false
           | negatives, and design my test around that. I figured I'd run
           | the test suite no more than 10,000 times, and I wanted a
           | 1/1,000,000 chance of ever seeing a false negative.
           | 
           | I can't remember the exact math I used at the time (I had to
           | crack open a stats textbook), but ultimately it boiled down
           | to generating a bunch of (seed, number of values previously
           | pulled based on that seed, value) tuples, running a linear
           | regression against them, and defining a maximum acceptable
           | R^2 value based on my 10^-30 acceptable probability of a
           | false fail.
           | 
           | When the RNG is not the thing being tested, mocking the RNG
           | to do a sampled sweep through the RNG's output range is
           | typically the correct move.
        
           | jerf wrote:
           | In the similar situations I've run, what I've often done is:
           | 
           | 1. Start with a known seed. 2. Run a single test run like
           | what you say, and verify this run by hand. 3. Freeze the test
           | in this state, that is, assert you get that exact result
           | every time on the given seed.
           | 
           | What this creates is not what I would strictly speaking call
           | a "unit test", but it _does_ sort of pin the algorithm to
           | your examined and verified output. In this case, a human
           | would quite likely have caught this problem on a decent test
           | set. Obviously, there are other pathologies that would slip
           | right by a human; the human being careful only raises the bar
           | for such pathologies, it doesn 't completely eliminate them.
           | 
           | But at least freezing it solves the problem where a change
           | you did not realize would be a change slips by unnoticed and
           | this function suddenly has a completely different outcome.
           | 
           | This has worked for me, in the sense it has caught a couple
           | of bugs that would have had non-trivial customer
           | implications. But I've never worked on an MMORPG or anything
           | else where randomness was intrinsic to my problem; it has
           | always been incidental, like, is my password generation
           | algorithm correct and does this sample of my data look like
           | what I expect, not the core of my system.
        
         | rcme wrote:
         | The RNG was supposed to generate a random number in [0, sum of
         | weights] not [0, num_players].
         | 
         | It's also possible to write a test for this where the behavior
         | in the test accurately tests the wrong behavior. The error is
         | pretty subtle. There was even a "bug" in your summary of the
         | bug ;)
        
         | EarthLaunch wrote:
         | Is it so important? I think this made the community and game
         | world more interesting. It's emergent behavior. As a game
         | developer, I hope I can make things complicated enough to have
         | emergent behavior, even if that's just from my bugs.
        
           | TheRealPomax wrote:
           | You know what would have made it even better though? Not
           | having a bug that made your character cursed through no fault
           | of your own without any recourse.
        
             | claytongulick wrote:
             | Would it have?
             | 
             | Now a player named Wi is still the subject of conversation
             | on at least two major online discussion forms over 20 years
             | later.
             | 
             | From what I've read, it introduced quirkiness and a bunch
             | of unintentional community involvement, with likely much
             | hilarity.
             | 
             | The goal of playing a game is to have fun.
             | 
             | Dealing with frustration can also be fun, in fact the Dark
             | Souls series recognized this brilliantly.
             | 
             | This bug, while undoubtedly frustrating, sounds like it was
             | also a lot of fun for a lot of folks.
        
       | thomasskis wrote:
       | The bugs in this game lead to some of the greatest gameplay of
       | all time.
       | 
       | I think the best bug was the movement possibilities during spell
       | casting from breaking animations. It created one of the most
       | complex and amazing PK (PvP) dynamics of any MMO to exist.
       | 
       | The complexity of being able to move only so much to still get
       | your cast off, and being able to slightly fast-cast or hold long
       | delay-casts to "outplay" your opponents created so much depth to
       | duels it was incredible.
       | 
       | Even after all these years I can still remember the Arc cast I
       | would do, it was the keyboard combo: Hold Left -> Hold Z -> X ->
       | tap/hold up to control the radius Then Hold Right -> Hold C -> X
       | -> tap up to reverse the arc to return to where you initiated the
       | cast so the spell could go off.
       | 
       | Man I miss this game, I hope someone creates a wonderfully buggy
       | remake someday!
        
         | thomasskis wrote:
         | If anyone remembers the days when guys like "Rookie" or the
         | UD's figured this out and mastered it, what a time to be alive!
         | Good ol' AB wars... :)
        
           | Nuzzerino wrote:
           | The late Anti Parazi (Reckful) figured it out way ahead of
           | his time, before Rookie. He's still considered to be the best
           | of all time.
        
           | thomasskis wrote:
           | Wow I had to go on a nostalgia tour and I found a Rookie
           | classic: https://www.youtube.com/watch?v=FwpujtVM6R8
           | 
           | Bugs really made this game one of a kind, it's sad it would
           | be so hard to replicate. The way he uses strafing and delay
           | casting on corners to fight odds is amazing.
           | 
           | I still remember my hands shaking when I was in PK fights
           | like this in my youth. The consequences of death made
           | fighting so much more intense in this type of MMO.
        
       | [deleted]
        
       | jdk wrote:
       | Really didn't expect to see AC at the top of HN. Asheron's Call
       | was the first game I worked on and I remember all the times we'd
       | joke with Wi about it and watch monsters beeline for him. It
       | seemed like one of those "Haha sure, player perception" problems
       | and not something that was actually real. IIRC someone did a very
       | cursory look at the code at one point but it never bubbled up as
       | important enough to assign someone to to actually investigate.
       | 
       | Wi came to one of the player gatherings with little printed out
       | cards and would hand them to people and say, "You've been Wi
       | flagged!"
       | 
       | The fondest of memories.
        
         | iamthepieman wrote:
         | A fellow comp sci major in college introduced me to AC. Bought
         | it on a whim after seeing him play it in his dorm. I still
         | remember the physical box with some special bonus map and swag.
         | 
         | Lost so much sleep power levelling on a rock with those ape
         | like creatures and just spamming magic to discover new
         | combinations. The discovery and wonder does not match up with
         | the graphics I see now when I search for screenshots and
         | videos. Beta and early WoW almost had the same effect but your
         | first is always special.
        
         | thaumasiotes wrote:
         | > IIRC someone did a very cursory look at the code at one point
         | 
         | Any idea how the targeting algorithm was chosen? It does not
         | behave the way this letter says that it should.
        
           | jdk wrote:
           | Nope, it was before my time. I joined the team in beta.
        
         | hesdeadjim wrote:
         | Any insight you could share on why the server didn't end up
         | being provided to the community for self-hosting?
        
           | jdk wrote:
           | I had been gone from Turbine for 8 or 10 years by the time
           | they decided to shut AC down, so I can only speculate. I
           | assume it had something to do with WB not wanting to "give
           | away" the IP but instead just lock it away in a vault.
        
         | berkle4455 wrote:
         | Sorry, who is Wi?
        
           | johnnyo wrote:
           | "Wi" was An early player of the game that was the a victim of
           | the bug. His character's name was Wi, and the bug was named
           | after him.
           | 
           | I remember people theorizing it was due to a short name (only
           | 2 characters), and so would create longer usernames to try
           | and avoid the "curse"
        
         | PolyphonyReq wrote:
         | I was in from beta until about 2004. Lots of fond memories!
         | Closest I've come to feeling the same way I felt playing AC in
         | recent memory is actually Valheim. Can't quite put a finger on
         | why, but there are very few games that hold such an important
         | place in my heart. I was a high schooler when it came out. Some
         | days I regret not going into game design, especially with the
         | current wave of VR games. Some days I'm tempted to quit my
         | major tech company job and try to create that magic myself in a
         | VR MMO.
         | 
         | But that would be something only a crazy person would do.
        
           | jdk wrote:
           | Yay! The first time an MMO lands for someone, it definitely
           | makes an outsized impression. The combination of social
           | outlet with a huge amount of free time is a recipe for
           | something great.
           | 
           | It's funny you mention Valheim - one of my groups in had a
           | core of people who I met back in the AC days and their
           | friends. We got to some real old man gaming that probably
           | annoyed their friends with all of the "back in our day..."
           | stories while we were running around the landscape, running
           | from trolls, etc.
        
         | blipmusic wrote:
         | Min-max:ed dagger warrior for the win! Also, fear the ash
         | gromnie! AC was never really trumped for me (AC2 was...
         | different?). I just wanted a world to roam, and the vassal
         | system is probably the only pyramid scheme that incentivised
         | making social connections. :) My patron did a lot corpse runs
         | for me.
        
           | jdk wrote:
           | For the last 15 years or so, coworkers ask when I'm going to
           | make a new allegiance system but "less broken". So many good
           | social behaviors came from its structure that it really
           | deserves another attempt.
           | 
           | And yeah, Ash Gromnies were the bane of so so so many
           | players.
        
             | blipmusic wrote:
             | As with many concepts designed to do good in this world I
             | think it's (unfortunately? not sure) human nature to
             | attempt to "solve" a system, whether the consequences
             | greatly diverges from - or is even the opposite to - the
             | intended path or not. (E.g. optimizing for time is not
             | always a good thing, but we often act as if it were - the
             | right amount of "grind" may mean I'm spending more time
             | doing other things than just gaining power, since it takes
             | too long anyway. Also, in real life, cooking _is_ quality
             | time to me, so I 'd rather not optimize that away etc.)
             | "The opposite" is the forbidden fruit that drives some
             | people in the first place, so "just the right" amount of
             | freedom seems almost impossible to design. In games, where
             | the only loss is time spent, I assume we take things a lot
             | further than in real life. There may be dire social
             | consequences of course, hence the need to police us unruly
             | players, or make the world explicitly harsh and design the
             | game play around this as in EVE Online.
             | 
             | Similar with the min-max:ing of the class-less system. :)
             | IIRC, the aforementioned "dagger warrior" was designed
             | around two things: double attacks at max attack power, and
             | mobs not being able to land a hit. The perfect glass cannon
             | that made it possible to survive AC's harsh lands even when
             | under-leveled - or die instantly. :)
             | 
             | The size of the world was another thing that drew me in -
             | another kind of "grind", if you will. Seeing other players
             | whoosh:ing by - literally running by, in a mount-less world
             | - was pretty hilarious, but the fact that it took time to
             | get around was only a good thing IMO. I _want_ a game world
             | where the only option is to carefully navigate a large,
             | dangerous desert to find the missing ingredient. The
             | current theme-park MMO juggernaut seems to lock most things
             | behind some  "boss" and be done with it, which makes the
             | game world pretty void of other players in most places. You
             | just move on to the next quest hub and leave old content
             | behind for ever. This also makes the world, regardless of
             | its actual size, only feel as big as the current "zone" (I
             | don't like "zones").
             | 
             | But in the end, the developer needs the game to be
             | profitable and the players want the most out of their money
             | spent. If my wants belong with a minority group the game
             | probably won't cater to me.
             | 
             | Not really sure what my point is (old man yelling at clouds
             | with contempt for "instant gratification" perhaps), but
             | thank you for AC and the time you spent developing it! :)
        
               | jdk wrote:
               | You're welcome!
               | 
               | I think I mentioned this in another comment and certainly
               | a ton over the years - but a lot of the magic of AC was
               | that it was made by a bunch of people who had never made
               | a game before, much less an MMO, and there were very few
               | ingrained lessons, so we were foolhardy enough to just do
               | things the way it felt we should, player behavior or
               | other consequences be damned. It was built on hopes and
               | dreams and naivete and that made it beautiful and flawed.
               | 
               | But also yeah, once something ships to players, it's now
               | "theirs" and not "ours". We stood in pretty stark
               | contrast to EQ's "you're in our world now" philosophy,
               | again, for better or worse.
        
             | PolyphonyReq wrote:
             | What do you see as the major flaws and what do you think
             | you would do differently?
        
               | rapind wrote:
               | It eventually ended up being a straight line where you
               | could add yourself lower and higher in the line with two
               | different characters, and turbo feed the xp upwards
               | (there were loyalty stats to push up and receive more
               | xp). It peaked with a prevalence of bots that would be
               | parked at the bottom feeding the line 24/7.
               | 
               | Loved AC. Bots kind of killed it IMO (something I feel
               | bad about contributing to), but also new MMOs (WoW
               | decimated the competition when it came out). I remember a
               | portal / recall trick with two vendors, where one would
               | sell a specific thing cheaper than the other would buy
               | it. This was before eBay cracked down on virtual goods.
               | Interesting times.
        
               | jdk wrote:
               | The biggest problem was the degeneracy once it was
               | "solved", instead of organizing around social circles. It
               | led to people feeling like cogs in the machine and skewed
               | play patterns and motivations.
               | 
               | I haven't really given it any serious thought but I'd
               | likely start with trying to more strongly codify the good
               | parts (incentivizing smaller circles inside of the larger
               | structure, making systems for patrons/vassals to play
               | together in more meaningful ways, etc) while highlighting
               | the positive actions that players could do / benefit
               | from. I don't want to say AC was TOO opaque but a lot of
               | it definitely suffered from being over designed for a
               | very hardcore market.
        
         | jdwithit wrote:
         | I loved Asheron's Call, played it a lot back in the day. My
         | friends and I were in high school at the time so we had
         | absolutely no idea what we were doing, but that didn't stop us
         | from running around the world goofing off. My hobby was making
         | characters with totally insane Run and Jump skills. Once you
         | leveled up enough you could literally leap from one end of a
         | town to the other like Superman, it was extremely funny. The
         | character was awful in all other regards, but I didn't care. I
         | made another character whose sole purpose was to climb to the
         | top of the highest cliff or building I could find, and jump off
         | it. And there were some HIGH places in AC. I miss being able to
         | play MMO's innocently like that rather than trying to min-max
         | every last bit of efficiency out of everything, as embodied by
         | WoW (another game I loved, but for different reasons).
         | 
         | I also really enjoyed the periodic story events that had really
         | dramatic impacts on the world, like the shadow invasion. It was
         | a great game, especially for its time. So thanks for whatever
         | part you played in its creation.
        
           | jdk wrote:
           | Thanks! Always nice to hear people who "grew up" play it. AC
           | having server-side physics and actually making use of them
           | led to lots of ridiculous and emergent gameplay. I don't know
           | how many hours I just spend idling in towns jumping from
           | rooftop to rooftop or seeing how high I could climb up
           | massive structures. Everytime I try to play again though, the
           | old "you can't go home again" hits too hard and I just
           | quietly close it back up and go back to the nostalgia.
           | 
           | I was on the design team, so was directly responsible for a
           | lot of the shadow invasion stuff (if you ever saw the big bad
           | Bael'Zharon running around in the live events, that was me!)
           | and other patches for the first 2 years of its lifespan.
           | 
           | Weirdly, I work on WoW now with my career having come full
           | circle after having not worked on MMOs since the mid 2000s.
           | :)
        
             | stefan_ wrote:
             | Ironically I think WoW had a bunch of these bugs too, with
             | mechanics prioritizing "oldest account id" first..
        
             | shostack wrote:
             | Are there any games since then you think captured the feel
             | of the unique discovery-based magic system?
        
               | jdk wrote:
               | In terms of discovery and wonder, I think Valheim did a
               | good job of it in the general atmosphere and loop, but in
               | terms of magic systems, not really. You have the Magika
               | (or even Path of Exile) where spells have component parts
               | and build into something larger, but there's not much
               | mystery there.
               | 
               | A theme of a bunch of the comments is that the internet /
               | audience makes this sort of thing impossible these days.
               | One of my white whales for game design is figuring out if
               | mystery, especially in multiplayer games, is still
               | possible in a meaningful way.
        
               | rjewell wrote:
               | Literal showerthought while ruminating on this idea: are
               | you aware of any multiplayer systems where individual
               | characters have intentional Wi flags (good and bad) at a
               | very granular level? for example, every spell or skill
               | includes a fixed modifier generated for the player so
               | that two identically built characters have different
               | capabilities. Every aspect determining success or power
               | has one. You are just slightly slower at lockpicking in
               | the rain and your fireball casts a little faster than
               | average, and the decrease in damage for casting while
               | moving is a bit more significant.
               | 
               | You remove the "meta" from the game because every
               | character has a different meta that is just a little too
               | cumbersome to figure out in any way other than "feel" it.
        
               | jdk wrote:
               | I think a few (persistent) games touched on things like
               | that, but I can't think of any that really went hard on
               | it for long-term characters (instead you mostly see it in
               | roguelikes/lites where if you got a bad roll, it didn't
               | matter since you were making a new character soon
               | anyway). At a very broad level, this is sort of what the
               | taper system did but that was cracked after 6 months or
               | whatever and it didn't really offer any meaningful
               | differentiation beyond brute-forcing permutations.
        
             | sveiss wrote:
             | My marriage and a good chunk of my career trajectory can
             | both be traced directly back to having "grown up" playing
             | AC and writing/coding for Crossroads of Dereth. It's a
             | little scary to think how different my life would be if I
             | hadn't picked up that box--possibly the only copy the EB
             | Games in my small English town would get--and gone "huh,
             | looks cool".
             | 
             | I think growing up during those years of transition, right
             | before the Internet became mainstream and ubiquitous, was a
             | huge boon. Sure, the early MMOs were far from the first
             | international social forum enabled by the Internet, but
             | they were right at the technological frontier at the time.
             | There was something special about inhabiting this massive,
             | 3D virtual space alongside people from across the world,
             | and having that experience be just as novel to everyone
             | else as it was to me.
             | 
             | You couldn't replicate that today, and growing up with the
             | world at your fingertips on a pane of glass as a taken-for-
             | granted fact of life must be a very different experience.
        
               | jdk wrote:
               | Oh man... Now I'm trying to remember which of the CoD
               | folks were from England. Thanks for all / any of the work
               | you put into that site. It was really the nexus of AC for
               | a number of years. I'm glad it's been lost to the ages
               | because I definitely had a number of real spicy comments
               | on it. I'm happy AC at least indirectly helped your
               | career/marriage in some small way. :)
        
               | sveiss wrote:
               | I was Dotcher on CoD and ingame, but I don't think we
               | ever spoke. I didn't post on the forums much at all, and
               | as a teenager on the wrong side of the world the fan
               | gatherings and the like were a tad inaccessible.
               | 
               | I did a bunch of writing, news posting, collecting
               | information for the monthly patch summaries, and then
               | they figured out I could code and I ended up building
               | tools and maintaining various bits of the site. I think I
               | ended up owning the item database code for a while? I
               | remember hearing that one got used at Turbine, because it
               | was superior to what you had internally!
               | 
               | I'm now married to Kelly Heckman (Ophelea), who was site
               | manager on CoD for a while, and my first real job was at
               | a social gaming startup, getting in the door with the
               | help of her network. That set my career on the path it is
               | now, so you can draw a direct line from picking up that
               | game box to where I am now. So yeah, thank you and the
               | rest of the team :).
        
             | wykillin wrote:
             | I also wonder how many hours and points I wasted into jump
             | to jump across the roof tops, haha. I absolutely loved the
             | server based physics, even though I had the crappiest dial
             | up connection at the time. I was 14 when I started playing
             | that game. So many amazing memories, Atlan stones, spell
             | system, cheesing death items, being afraid of losing
             | everything because there's no bank, haha.
             | 
             | Lately, I've been getting more and more into esoteric
             | topics and I keep thinking about this games lore... There
             | is so much occult knowledge/history baked into the entire
             | thing and I honestly still use the game as a reference
             | point for some many things.
             | 
             | I'm curious, do you know how the games lore was developed
             | and were there ancient texts that were inspirations for the
             | events?
             | 
             | Thank you!
        
               | jdk wrote:
               | > I'm curious, do you know how the games lore was
               | developed and were there ancient texts that were
               | inspirations for the events?
               | 
               | I was very not-involved with the lore/story (to the
               | point, where I think I wrote a handful of notes and stuff
               | before it being decided that I should just focus on
               | gameplay, and someone else would cover the lore for me!),
               | but there were 3-4 people primarily responsible for it
               | and they were all very much fantasy literate, so it
               | wouldn't surprise me at all if some of the inspiration
               | were from those sources.
        
             | yvdriess wrote:
             | Another "grew up playing AC" here and fondly remember
             | interacting with Bael'Zharon on the Harvestgain server
             | during the life events. Did you also blow up Arwic? :D
             | 
             | I still use AC and to some extent AC2 as an example of how
             | wild, weird, dynamic and interesting MMOs were before the
             | EQ formula won through WoW's success.
        
               | [deleted]
        
               | jdk wrote:
               | Yeah, I was also involved in blowing up Arwic. It just
               | felt right!
               | 
               | Definitely miss the "weird" MMOs of the early 00s...
        
         | a_e_k wrote:
         | Add me as another with fond memories. I was introduced to AC by
         | my coworkers at my first full time job after college. Pretty
         | much all the software devs I worked with at the time played it,
         | including both my manager and the head of the site. Our office
         | had our own little monarchy on Leafcull at first, though we
         | later joined up with a bigger group.
         | 
         | On patch day, the office banter usually centered around the
         | things we were seeing popping up as we'd reload Maggie the
         | Jackcat's community-sourced patch notes throughout the day [0].
         | 
         | Sometimes we'd even download the patch and log in for a few
         | minutes, just to poke around. (Always being careful not to do
         | anything _real_ due to the risks the infamous patch day server
         | rollbacks.) Then there'd the be waiting for the Decal updates.
         | 
         | I still remember that my main was a tank archer build, which
         | was pretty much untouchable going toe to toe with the mobs in
         | PvE as long as the stamina held out. I went through a _lot_ of
         | stam potions, though!
         | 
         | I remember also finding somewhere about how to extract the
         | terrain data from the game. I scraped the coordinates for
         | various destinations from some place and wrote a little OpenGL
         | viewer that would let me do flyovers with the various locations
         | marked with labelled bullets.
         | 
         | Good times!
         | 
         | P.S.: Anyone remember the Drudge Dance [1]?
         | 
         | [0] http://www.thejackcat.com/AC/Culture/Dereth/Dereth.htm
         | 
         | [1] https://www.angelfire.com/rpg2/dragons/Drudge_Dance.wav
         | (direct link doesn't work; copy and paste URL instead)
        
           | vehementi wrote:
           | I still hum the drudge dance sometimes. It melds together
           | with YTV "short circuitz" reels as well (this one in
           | particular https://www.youtube.com/watch?v=ScvIbcNV38k)
        
         | Naomarik wrote:
         | AC was my first MMORPG, fond memories indeed. I remember the
         | sheer adrenaline I got when "going red" and watching PK drama
         | and battles unfold at the subway, dominated by a build called
         | the "OG mage," slidecasting all over the place casting drain
         | health until finishing with a missile spell. I would cast
         | Blooddrinker 6 on monster weapons and giddily laugh as they
         | sliced through new players starting out. I remember staying up
         | the entire night during a school day when housing was released
         | and being one of the first people on my server to claim one. I
         | even remember being a vassal to a very generous asian guy in
         | his mid twenties living in LA named Kyoto and my countless
         | interactions with him and his brother under a specific tree.
         | 
         | Countless memories I could keep going on and on, but what an
         | experience!
        
           | picowatt wrote:
           | Some of my favorite memories as a kid were playing Asheron's
           | Call. Incredible game.
        
           | jdk wrote:
           | Haha "Og mage" ... yeah. The combat of AC still holds up in
           | its janky for being fun in the context of an MMO. I spent
           | most of my playtime on Darktide and dear lord, it made me so
           | sweaty.
           | 
           | It's amazing to me how many people are still friends with
           | their patrons/vassals from 25 years ago.
        
         | choffman wrote:
         | Devilmouse!
         | 
         | AC is one of my favorite games of all time (neck and neck with
         | Ultima II (I'm old)). I still play on the emulators from time
         | to time - endlessly searching for more Hoary Mattekars.
         | 
         | I played on Thistledown and ran a little portal bot named Stip
         | Dickens an Ayan Baqur that helped ferry people into the Shard
         | of the Herald event. That was a lot of fun.
         | 
         | The loot system was also one-of-a-kind. I don't see that level
         | of randomness in many other games.
         | 
         | The game felt like the writers and staff were highly literate
         | and well read. I now know so many real life herbs and plants
         | due to their use in spellcasting. And AC taught me words like
         | "Mnemosyne".
         | 
         | And each month we would get several pages of amazing lore.
         | (Side note, there's an ongoing web serial called "The Wandering
         | Inn" that reminds me quite a bit of AC. People dropped into a
         | video game like world, insect people, references to a
         | "Zeikhal"(similar to a town name)....
         | 
         | So, I just want to thank you for your work on AC. It's had a
         | profoundly positive impact on my life.
        
           | jdk wrote:
           | You're welcome! Haha, mattekar farming will always hold a
           | special place for me. And, of course, TD's herald defense is
           | probably top 3 gaming memories for me. So much lifting done
           | across the community for what's now basically oral history.
           | 
           | But also thank YOU for participating in some of my very
           | formative experiences of my life as well. The players really
           | made it a joy to work on.
        
         | nevir wrote:
         | AC was such a fantastic game and community - props to all you
         | at Turbine that worked on it. So many great memories for me!
        
           | jdk wrote:
           | Thanks! Glad it holds a special place for you :)
           | 
           | In retrospect, I give a lot of credit to the fact that we
           | were young and dumb and didn't know any better. I've been
           | revisiting a lot of the stories from back then and so many of
           | them end up with us saying, "I dunno, let's see what
           | happens!" and not being dissuaded by "best practices" or even
           | common sense.
           | 
           | Also lots of credit goes to the early internet era when
           | people were a LOT more forgiving of, well, everything.
        
       | dylanpyle wrote:
       | I've seen a similar mistake in a rushed "feature flagging"/phased
       | rollout system.
       | 
       | User IDs were random UUIDs. Let's say we want to release a
       | feature to ~33% of users; we take the first 2 characters of the
       | UUID, giving us 256 possible buckets, then say that everyone in
       | the first 1/3 of that range gets the feature. So,
       | 00XXX...-55XXX... IDs get it, and 56-FF do not. This works fine.
       | 
       | However, if we then release another feature to 10% of users -
       | everyone from 00-1A gets it, 1B-FF do not. That first set now has
       | both features, and 56-FF have none. It turns out you can't draw
       | meaningful conclusions when some users get every new feature and
       | some get none at all.
        
         | tmoertel wrote:
         | One easy way to avoid this problem is to give each feature its
         | own independent space of "dice rolls" by hashing the user ids
         | with feature-specific constants before interpreting them as
         | dice rolls:                   feature1_enabled = hash(user_id +
         | "-feature1") / HASH_MAX < 0.3;  # 30% of users.
         | feature2_enabled = hash(user_id + "-feature2") / HASH_MAX <
         | 0.1;  # 10% of users.
        
           | phreeza wrote:
           | If you suspect some flag effects interact with each other
           | (e.g. one flag increases button size by 10%, and the other
           | decreases it by 10%) you can go one step further and define
           | feature groups and hash by user-id + group-id and then assign
           | non overlapping ranges to the flags.
        
             | marcosdumay wrote:
             | Or you can cut and redistribute the non-performing changes,
             | increase the distribution of the well-performing ones, and
             | let evolution take care of disentangle correlated behavior.
             | 
             | But if need that kind of analysis for usability A/B
             | testing, you most be doing something very wrong on a
             | previous step.
        
           | groestl wrote:
           | For reference:
           | https://en.wikipedia.org/wiki/Consistent_hashing
        
             | singron wrote:
             | How is that related?
        
               | groestl wrote:
               | Consistent hashing (or more generally weighted rendezvous
               | hashing) provides pseudorandom allocations with minimal
               | reallocations when parameters change. This is exactly the
               | properties desired for rolling out feature flags
               | gradually over an input space like user IDs. It is a
               | special case of a consistent hash function, where the
               | possible assignments are just two (weighted) buckets,
               | corresponding to the feature flag's value of true/false.
        
         | Eduard wrote:
         | > That first set now has both features, and 56-FF have none. It
         | turns out you can't draw meaningful conclusions when some users
         | get every new feature and some get none at all.
         | 
         | 00--1A: have feature flags A and B
         | 
         | 1B-55: have feature flag A only
         | 
         | 56-FF: have no feature flag
         | 
         | So the actual gotcha here is that there is no cohort for
         | "feature flag B only", right?
         | 
         | This setup can actually be desirable if feature B depends on
         | feature A.
        
           | duskwuff wrote:
           | > So the actual gotcha here is that there is no cohort for
           | "feature flag B only", right?
           | 
           | And that, as you add more tests, user 00 will always get the
           | test treatment for _every_ test. If you 're running a lot of
           | tests which introduce experimental features or changes to
           | workflows, user 00 is probably going to find the site a lot
           | more chaotic and hard to understand than user FF, and that
           | will skew your test results.
        
           | dylanpyle wrote:
           | > So the actual gotcha here is that there is no cohort for
           | "feature flag B only", right?
           | 
           | Yep, exactly - by "that first set" I meant the 00-1A group,
           | could have been clearer. Whatever the smallest rollout bucket
           | is, that group is guaranteed to have every single feature.
           | 
           | This was quite a while ago, but I think the actual case we
           | noticed this with was several features released to 50% of the
           | userbase - so every single user either had all or none at
           | once (unintentionally)
        
         | xmonkee wrote:
         | Huh, thanks for this. Will live in my head from now. Basically,
         | in this situation, use (user_id, feature_name) for hashing, not
         | just the user_id.
        
           | dekhn wrote:
           | Is there a more general term for tuple hashing? IE, math and
           | theory around composition of hashes composed of concatenated
           | (or otherwise combined) typed values?
        
             | xmonkee wrote:
             | I think it's generally referred to as salting
        
           | yiuywieyrw wrote:
           | A better way is to assign some internal salt to the feature
           | at creation time and use that, that way you are not dependent
           | on something external that user (the creator of the feature
           | flag) could change. I bear the scars of this design mistake
           | from when I worked for a company that provided feature
           | flagging. It was not my initial mistake, but I drew the short
           | straw trying to work around it.
        
             | xmonkee wrote:
             | Solid tip, again.
        
           | dabeeeenster wrote:
           | Haha funnily enough that is our (Flagmsith's) exact
           | algorithm!
        
         | [deleted]
        
         | shoo wrote:
         | > you can't draw meaningful conclusions when some users get
         | every new feature and some get none at all.
         | 
         | those poor cursed users. reminiscent of a joke that used to
         | grace Paul Mineiro's blog (machinedlearnings.com) a few years
         | ago:
         | 
         | > An old curse says: "may you always be assigned to a test
         | bucket."
        
       | anyfoo wrote:
       | Around 15 years ago, when casual little games on Facebook were
       | still a thing (actually when Facebook itself was still a thing),
       | I used to play Yahtzee on the site while watching TV shows or
       | whatever. It was one of the most popular games on there. For me
       | it was something to fidget with (there was no money involved or
       | anything, just a personal high score), so I played it a lot.
       | 
       | I felt more and more that dice values of specifically 1 and 6
       | were harder to come by than other values, so one day I sat down
       | for a few minutes and logged the value of 100 or so dice throws.
       | Turns out I was right, the distribution was not uniform: 2-5 were
       | fine, but it seemed that it was _twice as hard_ to get a 1 or a 6
       | compared to any other value.
       | 
       | I even did a chi-squared hypothesis test, because I was crazy.
       | (And because I was studying for my statistics minor in university
       | at the time).
       | 
       | Seeing the result, the problem was pretty clear, without even
       | knowing the source code. Almost certainly, they had a random
       | number generator giving a number in a uniform range, let's say
       | from 0 to 1, and did something like the following to get a dice
       | value from 1 to 6:                  value = round(random()*5)+1
       | 
       | Do you spot the issue?
       | 
       | The problem is that round() rounds to the _nearest_ integer. So
       | any value between, say, 1.5 and 2.5 (exclusive at one end) rounds
       | to 2, 2.5-3.5 rounds to 3, and so on. Add 1, and you have the
       | dice value.
       | 
       | But the ranges for dice values 1 and 6, are only 0 to 0.5 and
       | 4.5-5 respectively, so ranges that are only half the size.
       | 
       | The fix should be extremely simple:                  value =
       | floor(random()*6)+1
       | 
       | The crucial point being to use floor() or ceil() instead of
       | round(), to only round towards one direction.
       | 
       | I wrote up exactly this in a short email to the company that made
       | the Yahtzee game. They did not reply and just silently fixed the
       | bug, right after my email. I was disappointed and stopped
       | playing.
        
         | phailhaus wrote:
         | You stopped playing because they listened to you and fixed the
         | bug for everyone?
        
           | bombcar wrote:
           | I remember writing a suggestion letter to Maxis about SimCity
           | and they not only replied but also sent me a copy of the
           | Terrain Editor. Very nice of them.
        
           | altairprime wrote:
           | They didn't say "thank you", which for many humans is
           | demoralizing.
        
             | xen2xen1 wrote:
             | And at that point he'd played the game a lot, so he
             | probably would have quit playing anyway. Were he like me,
             | the fun at that point was the statistics portion anyway,
             | and he'd already found and fixed that, so it was no longer
             | fun either.
        
           | anyfoo wrote:
           | After I (happily!) did their work for them, a simple "thank
           | you", or even an acknowledgment through a closed ticket,
           | would have entirely sufficed to make my day.
        
             | kvark wrote:
             | Or maybe the bug was closed as a duplicate of one they were
             | already aware of? Still impolite of them, of course, but we
             | shouldn't assume the worst.
        
               | Danieru wrote:
               | Protip for other gamedevs: when a player reports a bug
               | you already know about say "thanks for the report, the
               | fix will be in the next patch".
               | 
               | It is not the players fault patches take time to get
               | through QA. Nor should there be an implicit valuation
               | curve to free bug reports from players.
        
               | [deleted]
        
             | rcfox wrote:
             | Back when Stack Overflow was in beta, the original design
             | was really rough, so I mocked up a suggested new design for
             | the main page via Stylish and submitted it to them. Within
             | a day or two, they adopted something almost identical but
             | never acknowledged me. One could argue it was a pretty
             | basic idea (I only spent around 15 minutes on it myself)
             | and they probably arrived there independently, but I still
             | like to believe that I influenced a major site's design.
        
               | brigandish wrote:
               | Speaking of SO, their policy of removing "thank you" and
               | things like "any help is much appreciated" etc is why
               | I've stopped contributing to the site. Even ChatGPT has
               | better manners, and is possibly on the way to being more
               | human than the people who made that rule, and certainly
               | less of a wanker.
        
               | stavros wrote:
               | Back when reddit was good, I was a moderator of a pretty
               | large subreddit. One April Fools' day, I decided that, as
               | a joke, I'd edit my subreddit's CSS to show the "reddit
               | is down" image over of the home page. I did that, and, a
               | few minutes later, reddit was _actually_ down.
               | 
               | One could argue it was a coincidence, but I still like to
               | believe that I influenced a major site's uptime. Mostly
               | because they told me I crashed the site and asked me not
               | to play any more jokes like that again.
        
           | 30minAdayHN wrote:
           | Because they lacked decency and intellectual humility to
           | acknowledge his email despite benefiting from it.
        
             | tablespoon wrote:
             | > Because they lacked decency and intellectual humility to
             | acknowledge his email despite benefiting from it.
             | 
             | Or their internal communication was haphazard and not
             | designed to handle this case. I could totally imagine the
             | bug report getting passed informally through a game of
             | telephone and losing the connection to the external
             | reporter (e.g. at some point the report got paraphrased, so
             | the developer who fixed it doesn't know where the report
             | came from, and the person who received the initial report
             | doesn't know if it had merit or if it was fixed).
        
               | kadoban wrote:
               | Which is why you should immediately answer "thanks, we'll
               | look into it!", then at least they got something even if
               | you forget later. I learned this as a the triage guy in
               | one of my first jobs, as I have a very shit memory.
               | 
               | Worst case you thank someone for something useless.
        
           | narag wrote:
           | I sent a patch to a bigger and more known software company,
           | now defunct. I ended up writing some rude comments in the bug
           | submitting form, after being forced to enter endless data
           | about me, the company that I worked for and a lot of
           | information about how to reproduce the error. Not proud of
           | it, but I understand the GP: you're helping them and they
           | treat you poorly.
           | 
           | They included the fix in the next version of the tool. I
           | later noticed it was incomplete, but this time I just made
           | the correction locally.
        
             | macintux wrote:
             | It is quite maddening to have to provide personal
             | information to report a bug. My city stopped allowing
             | anonymous reports of broken traffic lights, so every time I
             | report one (much rarer now that they've made it harder) I
             | always give bogus information.
        
               | idontpost wrote:
               | Hey look Jimbob! The consultant says if we added
               | obnoxious paperwork requirements, there'd be fewer broken
               | traffic lights! I don't know how that's possible, but by-
               | golly it worked!
        
               | jfk13 wrote:
               | Wow ... how often do traffic lights break in your city?!
        
               | macintux wrote:
               | I see a burnt-out bulb at least once a week.
        
               | OJFord wrote:
               | I have _never_ seen that.. should we be exporting (
               | /presumably reselling) bulbs?!
        
               | jfk13 wrote:
               | Interesting. I feel like it's something I've only seen
               | _very_ occasionally - I don 't remember when I last
               | noticed one. Maybe you just have a much higher density of
               | traffic lights where you live, which would make it more
               | common to see failures; and/or maybe they're a different
               | type or differently maintained.
        
               | sublinear wrote:
               | https://youtube.com/watch?v=GiYO1TObNz8
               | 
               | Technology Connections
               | 
               | The relevant part about the old incandescent bulbs is at
               | 3mins 14secs
        
           | [deleted]
        
         | Stratoscope wrote:
         | > _the distribution was not uniform: 2-5 were fine, but it
         | seemed that it was twice as hard to get a 1 or a 6 compared to
         | any other value._
         | 
         | As soon as I saw that, I knew exactly what the problem was. I'm
         | glad I was reading on a small mobile screen, so I didn't feel
         | like I was cheating by getting a hint from the rest of your
         | comment.
         | 
         | Yes, voice of painful experience here!
         | 
         | > The crucial point being to use floor() _or ceil()_ instead of
         | round(), to only round towards one direction. [emphasis added]
         | 
         | Not quite. If the random() function in your language returns a
         | value in a half-open interval like Math.random() in JavaScript
         | or random.random() in Python, only use floor(), never ceil().
         | 
         | Those random() functions return a value _n_ where 0  <= n < 1.
         | In other words, n may be 0 but will never be 1. So floor() is
         | always what you want for a random function like that.
         | 
         | A somewhat related tip for anyone who implements a progress
         | message like "nn% done". You should always use floor() for that
         | number as well. Quite often I see a case where someone has used
         | round() instead, or possibly ceil(). And then what happens is
         | your notification message says "100% done" when the process is
         | _not_ 100% done. It makes me a little crazy when I see that.
         | Use floor() and you won 't have this problem.
        
           | madeofpalk wrote:
           | > Quite often I see a case where someone has used round()
           | instead, or possibly ceil(). And then what happens is your
           | notification message says "100% done" when the process is not
           | 100% done.
           | 
           | The video game Destiny has this problem with how it displays
           | objective percentages - it will round up, and there's a quest
           | every now and then that shows progress as a percentage and
           | has a high enough denominator to trigger this.
        
         | marton78 wrote:
         | How do you know they fixed it shortly after the email? Did you
         | keep sampling the distribution and performing chi square tests?
        
           | anyfoo wrote:
           | I had the impression 1 and 6 weren't as rare anymore (even a
           | single game is a lot of dice throws, and I usually played
           | several in a row and restarted a lot), so I sampled again. No
           | chi-squared test this time, that was just for my learning,
           | because it was obvious without.
        
         | fuglede_ wrote:
         | Heh, I remember running into something similar professionally,
         | using the .NET Framework to generate random numbers: When asked
         | to generate random integers, it has a seemingly innocent
         | conversion from integers to floating points and back that ends
         | up causing significant bias on large ranges. Specifically,
         | `Random.Next(b)` produces an integer between 0 and _b_ - 1 by
         | 
         | 1. taking a random integer between 0 and 2^31 - 2,
         | 
         | 2. dividing the integer by 2^31 - 1 to get a double-precision
         | floating-point between 0 and 1,
         | 
         | 3. multiplying this floating-point with _b_ to get a number
         | between 0 and _b_ ,
         | 
         | 4. taking the integer part of this new number to get an integer
         | between 0 and _b_ - 1.
         | 
         | Do this for _b_ = 2^31 - 1, and 50.34% of outputs are odd
         | numbers, where you 'd expect (almost) as many evens as odds.
         | 
         | Ended up doing a bit of a write-up here:
         | https://fuglede.dk/en/blog/bias-in-net-rng/
         | 
         | Another fun thing about their RNG was that it was apparently
         | supposed to follow Knuth's provably useful additive PRNG which,
         | given _n_ - 1 randomly generated numbers, generates a new
         | number by taking the sum of the ( _n_ - 24) 'th and ( _n_ - 55)
         | 'th numbers modulo some specific number; back when I looked,
         | Microsoft's implementation for some reason uses 34 instead of
         | 24, probably just a typo, with the unfortunate side effect that
         | Knuth's theoretical guarantees are out of the window.
        
         | bscphil wrote:
         | > I wrote up exactly this in a short email to the company that
         | made the Yahtzee game. They did not reply and just silently
         | fixed the bug, right after my email. I was disappointed and
         | stopped playing.
         | 
         | I love this. It's one of those things that's entirely
         | intelligible to me but I imagine would be next to impossible to
         | explain to a Martian.
        
           | deanCommie wrote:
           | Same :)
           | 
           | But here's another layer, though. What if it isn't?
           | 
           | Our science fiction is filled with this fairly human-
           | chauvinistic worldview where even in a hypothetical future
           | where we are rubbing shoulders with many different alien
           | species, many of them technologically superior to ours, some
           | of them still admire or begrudgingly respect us for our
           | ingenuity, spirit, some je ne sais quoi.
           | 
           | That we're illogical and inconsistent and jealous and petty
           | and insecure, but also humble and funny and empathetic and
           | creative.
           | 
           | But...we have no evidence that this would be unique about
           | humans whether sentient intelligence is common throughout the
           | universe or rare. In fact, it's quite possible, that this is
           | a necessary prerequisite, side effect, or consequence of
           | conscious intelligence.
           | 
           | So this hypothetical martian maybe would just smile, nod and
           | say "Ah yes, the company was embarrassed, or didn't want to
           | risk liability, or didn't want to risk their reputation being
           | compromised. But OP just wanted a thank you. He wouldn't have
           | wanted money, just a 'hey thanks for finding that for us'.
           | And it soured him on the whole experience. Been there, my new
           | human bro, been there."
           | 
           | edit: I wrote this before I saw the rest of the replys, and
           | HOLY, there's a bunch of _humans_ that don 't understand why
           | OP stopped playing.
        
             | eastbound wrote:
             | > it's quite possible, that this is a necessary
             | prerequisite, side effect, or consequence of conscious
             | intelligence.
             | 
             | I can't wait for AI psychologists. AIs hired to make AIs
             | talk about their reasonings because they are stuck in
             | feedback loops. AIs having to be debugged. AIs being too
             | selfish or too generous or too insecure that they keep
             | deflating what they try to say despite being of extremely
             | high value. AIs suddenly cracking nonsense when we need
             | them the most under high pressure. I'm persuaded all these
             | are required aspects of general organic intelligence.
        
         | [deleted]
        
         | lucasmullens wrote:
         | Interestingly that Yahtzee version was rigged in the player's
         | favor since they're more likely to get X-of-a-kind if the same
         | numbers appear more often. Average scores probably dropped a
         | decent bit after that fix.
        
           | anyfoo wrote:
           | For the short time that I knew about it and it was not fixed
           | yet, I integrated it into my strategy. 1 and 6 are rare, so
           | if for example I still needed them for something, I was
           | inclined to make good use of 1 and 6 when they came up,
           | instead of rerolling them for something else.
        
       | nluken wrote:
       | I love hearing about bugs like this one. It's a nice reminder of
       | the problem solving that made me fall in love with computer
       | programming, which sometimes gets obscured in the day-to-day
       | processes of working on software.
        
       | [deleted]
        
       | GuB-42 wrote:
       | It reminds me of the "charm tables" of some Monster Hunter games.
       | Charms are equipment with randomly selected skills. When you
       | create a character, you are assigned a random "table" and all
       | charms you may get are selected from that table. There are 17 of
       | them, 12 of them are normal with some slightly better suited to
       | some play styles but it is a really minor thing, the remaining 5
       | are called "cursed tables", they are much smaller and you will
       | never be able to get the best charms. It is not game breaking,
       | but it is annoying if you want a highly optimized build.
       | 
       | The reason it happen is that the random number generator has only
       | a small state (I think 16 bits) a limited number of possible
       | rolls, and some seeds have a really short period, which limits it
       | even more. Also, the seed is stored in your save file. It means
       | that if you have a bad seed, you will always have a seriously
       | broken RNG and the only way to change that is to create a new
       | character. I think in later games, the same terrible RNG is used,
       | but a new seed is picked each time you start the game, so you
       | won't stay in the same "table". And while "charm tables" are the
       | most obvious consequence, if probably has other, less noticeable
       | effects on gameplay.
       | 
       | The weird part is that while it is obviously a bug as it
       | negatively affects the experience of some random players, it is
       | rarely referred to as such. It even persisted between versions.
       | Some people even wrote tools to find out early on which table you
       | are, and techniques to get the table you want, along with a
       | variety of RNG manipulation exploits.
        
         | tm-guimaraes wrote:
         | Yes, Monster Hunter 3 Ultimate had the permanent table. While 4
         | was for game session.
        
       | arduinomancer wrote:
       | I totally get how this bug would end up in the game
       | 
       | Someone probably manually tested the feature originally and
       | thought "yeah this feels random"
        
         | bombcar wrote:
         | Apple had to add code to iTunes so that on shuffle it wouldn't
         | play two tracks from the same album after each other because it
         | wouldn't "feel" random.
        
       | BryantD wrote:
       | Sandra Powers (who finally figured the problem out) and her
       | husband have been writing and running their own MMO for quite a
       | while now. Check out http://projectgorgon.com/ if you're
       | interested in something handcrafted, quirky, and high quality.
        
         | shostack wrote:
         | How has that one been shaping up?
        
         | tsgagnon wrote:
         | Wow, I had definitely forgotten that was being worked on still,
         | it's been a long time since I've played it.
         | 
         | Also reminded me that I backed Camelot Unchained that's still
         | kicking around in development after all these years.
        
         | don_neufeld wrote:
         | I had the pleasure of working with Sandra at SOE for a while on
         | EverQuest II, and later I contracted with her and Eric to help
         | at my startup Ohai. They are both wonderful people and it's
         | great to see this game is still ongoing.
        
         | sveiss wrote:
         | My favourite part of this story is that Sandra's handle on the
         | fansites at the time was "srand". A highly appropriate
         | coincidence, given the nature of the bug!
        
         | DanHulton wrote:
         | I keep forgetting about this game and meaning to go back to it.
         | Definitely the "weirdest" (in a good way!) MMO out there.
        
       | Aeolun wrote:
       | Hmm, when they told me they were assigning people to a list I
       | kind of knew what the answer was going to be.
       | 
       | What is curious is that it took them a long time to find. I'd
       | think that -as long as you believe there is a bug- this should be
       | fairly straightforward to spot.
        
         | hinkley wrote:
         | > I'd think that -as long as you believe there is a bug- this
         | should be fairly straightforward to spot.
         | 
         | This is the power of continuous integration.
         | 
         | There's a certain amount of optimism needed to keep going as a
         | software developer, and then there's the crippling amount of
         | optimism that a lot of people have which makes for difficult
         | team dynamics. CI says it doesn't matter if it works on your
         | machine, it's red on a neutral box so fix your problems or it's
         | not going into the release. It's much harder to ignore Jenkins
         | than to ignore David.
         | 
         | People learn through trial and error that the Wally Filter
         | works on bugs, so denial is their first and best defense. Prove
         | to me there's a bug. I won't spend any time on it until you do.
        
         | ok_dad wrote:
         | I was waiting for them to say something like "then we take the
         | random variable and multiply it by 3 to correct for this" and
         | then explain some other, more subtle, bug. Looks like we all
         | make stupid mistakes like this sometimes. I made a bug where I
         | tried to get the month number for the next month, so you had to
         | wrap at 12, but I just did "(current_month + 1) % 12" and left
         | it at that, thinking for some reason that modulo works
         | differently than it does in reality. Some stuff broke recently,
         | due to that, and it was quite embarrassing.
        
           | Aloisius wrote:
           | I must be missing something. That is how modulo works. Well
           | as long as January is month 0.
        
             | thaumasiotes wrote:
             | You want (current_month % 12) + 1.
        
             | SoftAnnaLee wrote:
             | It seems that the issue is that `January === 1`; so when
             | you get to December (i.e. `12`) it rolls over to 0 rather
             | than remaining as 12.
        
         | Goronmon wrote:
         | I could be remembering incorrectly, but back when this was
         | occurring no one knew that issue was specifically limited to
         | "mob spawns attacked certain people". The more honest
         | description is the line about "From the beginning of AC, some
         | players have complained about unbelievably bad luck."
         | 
         | People blamed this behavior for everything from loot drops, to
         | combat outcomes, and to aggro mechanics.
         | 
         | And also remember that AC was before MMOs became massively
         | popular, and outside of specific events and locations, there
         | wasn't always more than a handful of players in a certain area
         | for a given server where aggro mechanics like this would
         | matter.
        
       | ergonaught wrote:
       | I miss AC so much it hurts.
        
         | dualboot wrote:
         | https://emulator.ac/ =)
        
         | vehementi wrote:
         | Yeah, reading through this thread I get an actual little pain
         | inside.
        
         | thomasskis wrote:
         | I dream of the day when I can ask an LLM to write a modern
         | version of AC in Unreal 7... Exploring Dereth with reality
         | level detail would be incredible.
        
       | veilrap wrote:
       | I love the "lore" that this sort of bug creates, especially in
       | these sorts of large scale multiplayer environments.
       | 
       | Players claiming to be cursed, and the curse was real!
       | 
       | A very different sort of event that it reminds me of is the old
       | World of Warcraft plague:
       | https://en.wikipedia.org/wiki/Corrupted_Blood_incident
        
         | LelouBil wrote:
         | Great read, thanks for sharing !
        
         | iamdbtoo wrote:
         | My theory for why people think they are being "shadowbanned" or
         | otherwise targeted by a social media company is often because
         | of bugs like this. They are weird and almost like gaslighting
         | in the way you experience them and people who don't understand
         | how these bugs can exist assume sinister motives.
        
           | nyanpasu64 wrote:
           | Shadowbanning is a very real phenomenon; my current Reddit
           | account was shadowbanned _twice_ because I had created and
           | posted memes which got unusually high upvotes for a new
           | account, and the algorithm thought I was a bot reposting
           | images to farm karma for future spamming. And from time to
           | time I see HN users whose posts are flagged by default. I 'm
           | less sure if/how shadowbanning occurs on Twitter.
        
             | kevingadd wrote:
             | The problem is that while shadowbanning is a real thing,
             | there are lots of bugs that also appear to be shadowbans
             | and might just be a momentary glitch or an unintended
             | interaction between systems. In Twitter's case, there are
             | multiple different penalties that can apply to account and
             | people refer to them all interchangeably as a "shadowban".
             | And some people claim to be shadowbanned when as far as
             | anyone can tell there's no function in Twitter's system to
             | do it, there's just something weird happening in the
             | infrastructure or algorithms (or it's all imaginary, who
             | can say)
        
               | mistermann wrote:
               | Or it is actually real and it is those who are imagining
               | it to be only imagined who are mistaken. Almost
               | everything we do is composed of substantial imagination,
               | _the whole system runs on it_.
               | 
               | What I find interesting is the substantial curiosity and
               | effort people will put towards solving questions in video
               | games, but when asked to solve problems in the game of
               | life that we are embedded in, people often seem to have
               | opposite instincts.
        
           | TeMPOraL wrote:
           | I remember Facebook around ~2010 would often seemingly delete
           | posts I published, or hide them from some of my friends. Or
           | from me. I could easily confirm that by viewing my profile
           | from another browser that wasn't logged in, or having a
           | friend sitting next to me open my profile.
           | 
           | Of course, it wasn't any kind of UI bug or automated
           | moderation. The experience gave me a visceral understanding
           | of what _eventual consistency_ means - a term I also first
           | learned around that time, during internship in an Erlang
           | company, and connected the dots.
           | 
           | I was one of the first people in my social circle to spot the
           | issue, but as it became apparent over a year or two before
           | eventually getting fixed (or at least made less obvious), I
           | ended up giving a very high level intro to distributed
           | databases to quite a few non-tech people, in order to
           | alleviate their concerns about Facebook gremlins.
           | 
           | This and other experiences using and building software
           | systems make me agree with you. Especially for large web
           | platforms, that weird thing you're experiencing _could_ be
           | some nasty form of shadow ban, but if you just noticed it
           | after doing something, then chances are it 's just a
           | transient issue with queues or database consistency.
        
         | shadowgovt wrote:
         | One of my favorite things in gaming is when lore develops from
         | bugs.
         | 
         | When they added the ability for Kerbals to be killed in Kerbal
         | Space Program, they tripped over a bug where the first Kerbal
         | in the game's engine, Jebediah (the one who dated back to the
         | original introduction of astronauts at all, where only one
         | existed), could not be killed. Because of some of the game
         | logic having gone unmodified from the earlier versions, some
         | operations would cause him to be loaded into the pilot seat and
         | those operations didn't check if he was deceased. As a result,
         | you could lose him on a mission only for him to spontaneously
         | appear at the controls of another mission.
         | 
         | The community responded with fan-art of "Jebediah Kerman,
         | thrillmaster."
        
           | marcosdumay wrote:
           | The KSP community has lore about the Kraken. They will joke
           | about anything.
        
             | TeMPOraL wrote:
             | The Kraken is a great example indeed. An eldritch horror
             | lurking in the outer reaches of the solar system, that is
             | not fond of Kerbals who are too ambitious, trying to get
             | too far, too fast. A cosmic being beyond understanding. You
             | can't see it and will never know where it is, if the
             | concept of being in a place even applies to it. All you can
             | know is that, as you travel further and further out, one
             | day you may notice the laws of nature start to change, and
             | this means the Kraken is about to have you for dinner. And
             | sometimes, if it spots you doing something you shouldn't
             | be, it will reach out even all the way to your home world
             | and consume you there.
             | 
             | When it strikes, it eats you swiftly, and eats you whole.
             | It disassembles your crafts, spaghettifies your crews. No
             | weapon or speech will save you. The Kraken transcends
             | reality - even time travel, reloading from a saved game
             | state, does not always stop the attack.
             | 
             | --
             | 
             | Of course, the Kraken is just a manifestation of unstable
             | physics calculations and a floating point-based coordinate
             | system: as you travel further out, the spacing between two
             | consecutive coordinates gets bigger, until it overwhelms
             | the physics engine and your craft disintegrates. And if you
             | start doing crazy stunts, particularly involving high
             | impulses or very fast rotations, the physics will break
             | even if you're close to coordinate origin, due to rounding
             | errors.
        
               | a_e_k wrote:
               | I haven't played KSP yet, but that description makes me
               | think a lot of the Dragons in the 1955 short story "The
               | Game of Rat and Dragon" by Cordwainer Smith [0].
               | 
               | > Somewhere in this outer space, a gruesome death
               | awaited, death and horror of a kind which Man had never
               | encountered until he reached out for inter-stellar space
               | itself. Apparently the light of the suns kept the Dragons
               | away.
               | 
               | [0]
               | https://www.gutenberg.org/files/29614/29614-h/29614-h.htm
        
               | shadowgovt wrote:
               | The trick the devs used to ameliorate Krakening was
               | pretty clever: they "smeared" acceleration between the
               | reference frame and the ship components so that the
               | position delta frame-to-frame was lower and therefore
               | more of the interactions occurred in the higher-density
               | floating point space of lower forces and smaller
               | displacements.
        
           | ReactiveJelly wrote:
           | I don't think I got the punchline. Thrillmaster and coming
           | back from the dead?
        
       | downvotetruth wrote:
       | What does "Wi" stand for in the stamp? Would have been better to
       | have a flag of freshmeat.
        
         | trynewideas wrote:
         | Apocryphal but as valid as anything when it comes to MMO
         | terminology:
         | 
         | https://forums.ddo.com/forums/showthread.php/264543-Wi-Flag-...
         | 
         | > Anyone who played Asheron's Call probably heard of the AI bug
         | associated with monster Aggro where a person name "Wi" was
         | forever cursed with getting the aggro no matter what.
        
         | hesdeadjim wrote:
         | From what I recall it was a character named Wi who was
         | persistently vocal about it.
        
           | dualboot wrote:
           | This is the correct answer. Wi was a prolific blogger and fun
           | personality.
        
             | Sivart13 wrote:
             | would love to know how "bad" Wi's hash actually was, like
             | what percentile of the users DB sorted higher/lower than it
        
         | emdashcomma wrote:
         | One of the impacted players had an in-game character named Wi.
        
         | BryantD wrote:
         | As trynewideas says, "Wi" was the name of the player who
         | famously described this problem. Source: I worked for Turbine
         | at the time.
        
       | jefftk wrote:
       | (2002)
        
       | Goronmon wrote:
       | Strange to see this exact topic come up twice in two days (the
       | other on Reddit).
       | 
       | But as a huge fan of the original AC, it's always fun to see it
       | come up still.
        
         | jedberg wrote:
         | Most likely someone saw it on reddit and posted it here. :)
        
       | karaterobot wrote:
       | So it's not really a flag, it's that the algorithm that
       | determines who the monsters attacks had a bug. The bug made it so
       | that when there were a group of players to choose from, the mob
       | would always pick players whose (hashed) identifier was higher on
       | the list. Since the hash of your ID doesn't change, those players
       | would always get picked on first. Like if your name is Aaron A.
       | Aardvark, you're always coming first on any alphabetized list.
        
         | dmurray wrote:
         | But it wouldn't always pick them, it would pick them with a
         | higher probability that also depended on the players' relative
         | distances to the monster.
         | 
         | So it's a stochastic bug where any given occurrence can be
         | explained as "you just have confirmation bias, you don't notice
         | all the times Zygy Zebra gets attacked" or "you must have been
         | closer than Zygy even though you thought you were a bit further
         | away". Especially if the game has a first-player perspective
         | which makes it harder to estimate whether you or another player
         | is closer.
        
       | thaumasiotes wrote:
       | I don't understand the math. They are very clear about what they
       | want their algorithm to achieve:
       | 
       | > The problem comes up when we are assigning portions of the
       | range to various players. If we wanted distance from the creature
       | to be proportional to your chance to be selected--that is, if the
       | closer you are the _less_ chance you have of being attacked--then
       | we would assign this range by taking your distance from the
       | creature over the total distance--the distances of everybody
       | under consideration added together. _But we really want the
       | inverse of this ratio_
       | 
       | That couldn't be more explicit. In the example model, where
       | distance is danger, player D is twice as far away as player A,
       | and has twice the chance of being attacked.
       | 
       | To invert that, in the game, where proximity is danger, when
       | player A is twice as close as player D, he should have twice the
       | chance of being attacked.
       | 
       | The game's algorithm does not attempt to do this. In the worked
       | example, player A is 50% more likely to be attacked than player D
       | is.
       | 
       | The correct algorithm is not difficult to write or to execute:
       | 
       | 1. Assign all players equal odds of being attacked.
       | 
       | 2. Weight the odds by the ratio of
       | (distance_to_furthest_targetable_player / distance_to_me).
       | 
       | To make the example easier to follow, assign player D [distance:
       | 10] 60 units of probability space. Then player A [distance: 5]
       | should receive 60*(10/5) = 120 units, player B [distance: 2]
       | should receive 300 units, and player C [distance: 3] should
       | receive 200 units. Generate a real number (or, heck, an integer)
       | in the range [0, 680) and you have your selection. Or, if you
       | prefer, normalize all the odds and then generate something in the
       | range [0, 1). But how did they pick the crazy algorithm they're
       | actually using?
        
       | Papychulo0217 wrote:
       | [flagged]
        
         | susrev wrote:
         | Really?? Scams On HN now?
        
           | smegsicle wrote:
           | turn on showdead and you'll often see them around
        
       | kypro wrote:
       | What am I missing here? Unless all the devs were really bad at
       | maths (unlikely if they're game devs) then this seems like a
       | really easy bug to find all things considered?
       | 
       | I thought maybe it was going to be some weird DB glitch or
       | something far upstream from the algorithm selecting which player
       | to attack, but it was literally the logic of the very algorithm
       | you would first look at if you were aware of such an issue.
       | 
       | This was a fun read though. Finding and fixing bugs like this is
       | some of the most satisfying work we do imo, and no one outside of
       | tech understands =)
        
         | mabbo wrote:
         | It's game code that was written in the late 90s. Unit tests
         | aren't very likely. And a quick glance at the code probably
         | looked completely sane.
        
         | hinkley wrote:
         | I'm missing something here and it has nothing to do with math.
         | 
         | Why couldn't they reproduce the problem in testing? For what
         | was it, years?
        
           | voakbasda wrote:
           | Likely because they tested with characters that were not
           | affected. Sometimes reproducing bugs takes good luck more
           | than skill.
        
             | remram wrote:
             | All characters would have been affected. If they had picked
             | any 3 characters, and put them in a room with monsters
             | repeatedly, they would have observed that the same
             | character was attacked most times.
        
         | kkoncevicius wrote:
         | Yes I came to post exactly this, and found your comment, so
         | will reply instead. The bug doesn't seem to be obscure. It is
         | there in the right place. Someone thinking about checking "why
         | some players are attacked more often?" would probably choose
         | this as the first place to double check, since it is directly
         | related to selecting the player for attack.
         | 
         | Maybe the most occult part of this is figuring out that the
         | unique IDs assigned to the players play a role.
        
           | thaumasiotes wrote:
           | > The bug doesn't seem to be obscure. It is there in the
           | right place.
           | 
           | Well, there is a larger bug -- the entire algorithm,
           | functioning properly, still won't behave the way this letter
           | says that it should. It's not clear what it's designed to do,
           | but it's very obvious that it doesn't do what the description
           | says it does.
           | 
           | Did nobody ever notice _that_?
        
         | Strilanc wrote:
         | I would speculate the main hurdle was probably _believing the
         | players in the first place_. Humans are notoriously bad at not-
         | noticing-patterns in properly random data. And statistical bugs
         | like this require more effort and careful attention to detail
         | to reproduce than deterministic bugs.
         | 
         | Another hurdle is likely that game developer culture strongly
         | favors integration testing over unit testing. Games are
         | optimized for fun, not correctness, and you can't unit test
         | fun. This specific roulette selection function would have been
         | straightforward to unit test, and a unit test would have caught
         | the distortion. But now imagine people keep varying how
         | important distance is to the calculation in order to make it
         | "feel right". Updating those unit tests is suddenly a
         | noticeable slowdown on how quickly you can iterate on game
         | feel.
        
           | bombcar wrote:
           | Yeah, WoW had many many problems with people not
           | understanding probabilities that they added explicit code to
           | track all drop rates and compare them to intended - and
           | actually found a bug or two that way.
           | 
           | But mostly it was to explain to people that a 1 in 100 chance
           | doesn't mean you'll get it even after 200 goes.
        
         | Normal_gaussian wrote:
         | Systematic debugging flaws probably; and lack of tooling to
         | easily isolate.
         | 
         | Systematic flaws: a cross between groupthink, early flawed
         | assumptions, deference to team leads, a 'I just look for 1hr,
         | if I can't find move on' (which leads to not looking), or just
         | plain simple "reading" instead of searching.
         | 
         | Lack of tooling: many game engines are infamous for lack of
         | control over tooling. I havent used many, but I understand it
         | would be quite an effort to run meaningful parameterised or
         | structured fuzz testing on most systems. This makes it hard to
         | artificially confirm suggestions. That said, there is
         | practically no excuse for them not to just add a bunch of
         | counters to the game - even on their internal testers it would
         | very quickly become clear there was a bias.
         | 
         | Most of my 'should have caught it earlier bugs' are of the
         | 'deference to lead' variety. I looked, didn't see immediately,
         | handed off with some notes, and then the follow up debugger(s)
         | took notes or thoughts as gospel. This is really hard to fight
         | - I write something along the lines of "my hunch is there is a
         | problem in code x because it handles y and is poorly
         | structured/tested. I checked z and found i, j - queries as
         | follows" and then find the debuggers effevtively refuse to look
         | anywhere past x. This is particularly true for a group of
         | debuggers, who play chinese whispers with groupthink and invent
         | reasons it must be x.
        
       | [deleted]
        
       | EarthLaunch wrote:
       | Why does weighted randomness seem so difficult for games? Are
       | there any libraries that simplify this? I couldn't find any for
       | JS.
       | 
       | So I created my own "algorithms" for things like randomly
       | choosing which type of plants spawn in the world. It weighs them
       | by the local frequency of each land-type. Eg if there's more
       | swamp nearby, it's more likely to spawn cattails.
       | 
       | It's awful. Not intuitive. Weights have to be passed in ordered
       | smallest to largest. Posting in hopes someone will correct my
       | entire approach or point out an industry-standard way of doing
       | these things.                 Utils.weightedRandom(percents,
       | types)            function weightedRandom(weight, outcomes){
       | var randNumber = Math.floor(Math.random()*100)         for(let
       | i=0; i<weight.length; i++){           if(randNumber<weight[i]){
       | return outcomes[i]           }           else {
       | randNumber -= weight[i]           }         }       }
        
         | shadowgovt wrote:
         | Statistics is actually pretty hard to get right, and it is the
         | nature of the problem space that errors aren't immediately
         | apparent unless one actually runs analytical regression on the
         | algorithm to confirm it has the right "shape," which (a) can be
         | time-consuming given the complexity of the algorithm and (b)
         | doesn't tend to be part of unit tests because unit test
         | doctrine is pathologically opposed to nondeterminism.
         | 
         | (This last pert is not an unsolvable problem, and in fact
         | random algorithms _should_ be unit tested. But it requires the
         | right kind of unit testing).
        
           | nmca wrote:
           | On occasion I have written a seeded large n statistical test
           | that passes & the submitted with the seed fixed. I think this
           | is the soundest approach, although it has a "your random
           | number is 7" feel to it.
        
         | [deleted]
        
         | jefftk wrote:
         | In Python:                   random.choices(population=['A',
         | 'B', 'C', 'D'],                        weights=[3, 2, 5, 7])
         | 
         | https://docs.python.org/3/library/random.html#random.choices
        
           | EarthLaunch wrote:
           | Thank you very much! That led me to a JS clone[0].
           | 
           | Python has amazing math libraries. I use numjs[1] for
           | everything, which is a port of numpy. I frequently wish I had
           | use of Python's libraries.
           | 
           | 0: https://github.com/parmentf/random-weighted-choice
           | 
           | 1: https://github.com/nicolaspanel/numjs
        
         | dekhn wrote:
         | IIRC the other solution is to make a tree structure instead of
         | a CDF. Can't remember if it's a good solution though.
        
         | freitzkriesler2 wrote:
         | I've been pondering a way to implement a quantum random number
         | generator into a game. Could this be useful at all?
        
           | EarthLaunch wrote:
           | What is the general benefit to a quantum random number
           | generator versus a regular one? Is it that it's more truly
           | random, or has a better distribution, or?
        
         | arduinomancer wrote:
         | https://leetcode.com/problems/random-pick-with-weight/
        
           | EarthLaunch wrote:
           | First dent in my anti-leetcode opinions. Thanks.
        
         | rcme wrote:
         | In your example, the weights need to add up to 100 to work
         | correctly, right? The issue with the code in the article is
         | that the weights did not add up to 1.
        
           | EarthLaunch wrote:
           | Right, I'm using a percentage. The article's bug reminded me
           | of this directly!
        
         | ryani wrote:
         | Here's the standard algorithm for this problem
         | function weightedRandom(weight, outcomes){           var total
         | = sum( weight );           var roll = Math.random()*total; //
         | value in the range [0,total)           var seen = 0;
         | for(let i=0; i<weight.length; i++) {             seen +=
         | weight[i];             if(roll<seen)               return
         | outcomes[i];           }         }
        
       | theptip wrote:
       | It seems quite uncommon to write the statistical unit test for
       | this sort of algorithm; I suppose most languages lacking
       | statistical programming toolchain makes it less appealing.
       | 
       | I wonder if there's a cheap Frankenstein approach to create a
       | test-only interface into your code with a CLI / FFI and wrap it
       | with some Python to easily test the result distributions.
       | 
       | Then you can use tools like scipy or newer probabilistic
       | programming frameworks like pyro. Not sure what the FFI story is
       | in R, maybe something similar could be done there.
        
       | [deleted]
        
       | cratermoon wrote:
       | Random numbers are hard.
        
       ___________________________________________________________________
       (page generated 2023-02-11 23:01 UTC)