Ok, so first if you don't want to use "NEWID" function to generate a random number, then you could use the "RAND" function, something like this would be randomish:
SELECT CAST(ROUND((RAND() - .5) * 2147483647, 0) AS INT)
If you need a BIGINT, cast it to a BIGINT, but keep in mind it's only going to give you the entropy (and Range) of a INT:
SELECT CAST(ROUND((RAND() - .5) * 2147483647, 0) AS BIGINT)
Allot of these other answers are returning BIGINT's for that I would recommend using the "NEWID" function, but I would do this different. For instance, if your doing any variant of using one "CHECKSUM(NEWID()) AS bigint)" and then returning a BIGINT, you only have the entropy of the INT, rather than one of a BIGINT, instead try using two:
SELECT CAST(CAST(CHECKSUM(NEWID()) AS BINARY(4)) + CAST(CHECKSUM(NEWID()) AS BINARY(4)) AS BIGINT)
I suppose if you really don't like "NEWID" function you could do this with "RAND" too:
SELECT CAST(CAST(ROUND((RAND() - .5) * 2147483647, 0) AS BINARY(4)) + CAST(ROUND((RAND() - .5) * 2147483647, 0) AS BINARY(4)) AS BIGINT)
Now that should (more or less) give you the entropy of a BIGINT, of course it's probably not perfect and I haven't proved out yet whether it generates a even distribution, so use with caution.
Really if you want ensure a given ID is unique, you need to use a GUID or a GUID equivalent, if your generated value in not within that range you will have to do that, or track generated fields in a separate table/scan the table before creating the ID. There is not a way around that. Also you cannot generate two independent values in a random way with a 0% chance of collision. You can get close enough to be perfectly safe though.
(Note: For those NOT afraid of using NEWID) I would do the following to get the full 16 bytes of entropy with minimal gymnastics:
SELECT CAST(CAST(NEWID() AS VARBINARY(8)) AS BIGINT)