I'm not sure there's a much better way to do this. To my knowledge, Osiris can only produce random values through modulo of a random number; therefore the min value is always going to be zero (You could impose a minimum with a custom random query, but you've asked for simplicity). As a result, if you want to have random values with a higher min, you'll need to use object scripts, as you have done.
That being said, here's my 5 minute approach to it:
Object script:
INIT
CHARACTER:__Me
INT:%DEMO_RandomEXP_Min
INT:%DEMO_RandomEXP_Max
INT:%DEMO_RandomEXP_Value
EVENTS
EVENT DEMO_AddRandomEXP
ON
OnFunction("DEMO_AddRandomEXP")
ACTIONS
//Set(%DEMO_RandomEXP_Min, <MinValueHere>) //Probably best to set these in calling block before calling this function.
//Set(%DEMO_RandomEXP_Max, <MaxValueHere>) //Probably best to set these in calling block before calling this function.
GetRandomBetween(%DEMO_RandomEXP_Value, %DEMO_RandomEXP_Min, %DEMO_RandomEXP_Max)
CharacterEvent(__Me, "DEMO_AddRandomEXP")
Story script:
IF
StoryEventSet(_Char, "DEMO_AddRandomEXP")
AND
GetVarInteger(_Char, "DEMO_RandomEXP_Value", _Value)
THEN
PartyAddActualExperience(_Char, _Value); //There are a few EXP granting calls, make sure you understand the differences between them, and use the one that best fits your intent.
The character could CallFunction("DEMO_AddRandomEXP") after setting the min and max values, and all would be taken care of.