There's no good way to do it in the core, but there are several optional modules that can help, at least with free roles. It's a great big gap in the use of DNN.
Search on Snowcovered for SeamlessModules, and also AllDNNSkins' LoginCombo, then there are also a couple of customizable registration form modules that can handle role assignments.. search for Datasprings and Ucanuse. Another option I've used is Gumbosoft's paypal cart to allow purchasing of roles, but this doesn't mix easily with free roles, which will have to be assigned on another page.
Or if payment processing is involved then consider adding to the end of this thread here, where I made along post about it:
http://www.ventrian.com/Support/ProductForums/tabid/118/forumid/14/postid/30322/view/topic/Default.aspx
Or, for a newer module that has started with free roles and may gain payment processing, also consider posting to this thread at WorkControl:
http://www.workcontrol.com/Support/SupportForum/tabid/57/forumid/22/threadid/541/scope/posts/Default.aspx
Rob