The way Nxt does it is actually quite clever and solves the nothing at stake problem, there is more to it than this but the part of it that I understand is that choosing who forges next is every forger does SHA(last forger public key) Somehow how long ago an account forged and how many nxt owned by that account and information from the last block is factored in as well. The winner is the one who has the largest hash.
That's not how I understand it from looking at the code. You don't so much choose who forges next, rather the node can decide wether a block is valid or not.
For the block to be excepted.
1. Hash the hash of the previous block.
2. Take the first six bytes of that. Let's call that rnd_selector
3. Take the current time since the last block in millis i.e. 100000
4. Take the effective balance of the account that generated the block.
If balance * time_in_millis > rnd_selector then the block is valid.
Code here
https://bitbucket.org/JeanLucPicard/nxt/src/046e59e4df43309a37c2789efd39dba4a873bbe2/src/java/nxt/Generator.java?at=master#cl-160Basically any account that meets the above criteria can generate the block, if no one can (or someone is offline) time_in_millis will grow and eventually someone will be able to generate the block.
So to build a competitive chain in NXT, I would have to alter the block message so that rnd_selector keeps on selecting one of my accounts.
The above was drawn from the code so perhaps one of the NXT guys would clarify if this is inaccurate.